Introduction

The COVID-19 global pandemic has emphasized the importance of healthcare accessibility, particularly access to primary care physicians, who provide the first point of contact between patients and the healthcare system. In Canada, the Canada Health Act states that all residents should have “reasonable access” to healthcare. However, the 2017 Canadian Community Health Survey revealed that 15.3% of Canadians aged 12 or over did not have a primary care physician, of whom 17.2% stated that there is no physician accessible within their area (StatsCan 2019).

Accessibility to healthcare services is defined by both spatial and aspatial components (Joseph and Bantock 1982). Aspatial factors include the cost and quality of healthcare services and the socioeconomic, demographic, and mobility profile of potential users (Joseph and Bantock 1982). The second component considers geographic accessibility, which can be defined as the potential to interact with a given set of opportunities, such as healthcare facilities or primary care physicians, from a given location using the transportation network (Hansen 1959). Accessibility to healthcare can therefore be improved through either an increase in the number of available opportunities or through improvements to the transportation network.

In general, four approaches for calculating accessibility exist: infrastructure-based approaches, which focus on the capacity of transportation infrastructure; location-based approaches, which focus on spatial distributions of opportunities; person-based approaches, which focus on accessibility on an individual level; and utility-based measures, which focus on the utility derived from interacting with the opportunity or participating in an activity (Geurs and van Wee 2004). Of these, place-based measures are the most common in the literature and, of these, the family of “floating catchment area” (FCA) methods is one of the most popular approaches for calculating place-based healthcare accessibility. Because healthcare access is sensitive to demand and supply, Luo and Wang (Luo and Wang 2003) (drawing on Radke and Mu (2000)) introduced the Two-step Floating Catchment Area (2SFCA) method that first estimates the demand for healthcare at service locations from population zones and then allocates the level of service back to the population zones using a binary measure of travel impedance.

Since then, various improvements have been made to the 2SFCA approach to better capture the friction of distance. The original 2SFCA has been criticized for over-estimating demand and under-estimating levels of service in the estimation of accessibilities due to the multiple-counting of populations that arises from the overlapping catchments in a study area. In response, researchers have proposed solutions such as the Three-step Floating Catchment Area (3SFCA) (Wan, Zou, and Sternberg 2012), Modified 2SFCA (M2SFCA) (Delamater 2013), and Balanced 2SFCA (B2SFCA) (Paez, Higgins, and Vivona 2019) methods. Of these, the B2SFCA is the only approach that preserves the original population and resulting levels of service in calculating floating catchment accessibilities.

However, despite these innovations, FCA methods remain limited in several ways. First, FCA approaches often inflate or deflate demand and supply in the calculation of healthcare access. While the B2SFCA remedies this, it does so by assigning fractions of populations to clinics and service ratios to population zones. While the parameters of the balanced method sum to the original zonal populations and provider-to-population ratios, this fractional approach does not reflect the ways in which individuals choose to visit facilities. Second, the appeal of any given healthcare facility from the perspective of the population is based solely on its distance or travel time from the origin zone using the transportation network.

In response, this research utilizes a random utility-based formulation for modelling accessibility to healthcare services. In contrast to FCA approaches, each patient is, on average, assigned to a single clinic, avoiding the issue of double-counting and inflation/deflation of the demand and levels-of-service respectively in the 2SFCA methods and the assignment of fractional individuals to clinics in the B2SFCA method. Beyond travel time, this specification also allows the analyst to include additional characteristics of the facilities that affect their appeal, such as CONGESTION. To illustrate the potential of the MNL approach, we compare it against the use of the 2SFCA and B2SFCA, both using a continuous decay function.

Methodology

Floating Catchment Methods

The 2-step floating catchment area (2SFCA) method, developed by Luo and Wang, calculates accessibility to healthcare using catchment areas based on a travel time threshold (Luo and Wang 2003). The first step of this method is calculating the physician-to-population ratio, \(R_j\), for each clinic at location \(j\):

\[ R_j = \frac{S_j}{\sum_i{P_iW_{ij}}} \]

Where \(S_j\) is the number of physicians at clinic \(j\) and \(P_i\) is the population of zone \(i\) weighted by some function of the travel time \(W_{ij}\) between zones \(i\) and \(j\). In the original 2SFCA, Luo and Wang (2003) utilize a binary impedance function:

\[ W_{ij} = f(t_{ij}) = \left\{ \begin{array}{ll} 1 & \quad t_{ij} \leq t_0 \\ 0 & \quad t_{ij} > t_0 \end{array} \right. \]

where the weight equals 1 for populations within the travel time threshold \(t_0\) and zero beyond. In this case, Luo and Wang (2003) set \(t_0 = 15\) minutes. The second step calculates accessibility \(A_i\) for the population centres as the sum of the physician-to-population ratios \(R_j\) weighted by the impedance function:

\[ A_i = \sum_j{R_jW_{ij}} \]

While the 2SFCA approach is a special case of a gravity-based accessibility measure, the binary impedance function used by Luo and Wang (2003) does not consider the effects of competition and travel impedance within a given catchment area. All clinics within a population centre’s catchment area are considered equally accessible, regardless of distance, size, wait times, or any other measures of attractiveness. Moreover, all clinics outside of a population centre’s catchment area are considered completely inaccessible. To remedy this, Luo and Qi (2009) propose the Enhanced 2-step Floating Catchment Area (E2SFCA) method that introduces categorical weights for different travel time thresholds to account for travel impedance. Others have improved on the 2SFCA and E2SFCA by using variable catchment sizes (McGrail and Humphreys 2009), continuous travel time decay functions (Dai 2010), and adaptive approaches (Bauer and Groneberg 2016) to better reflect travel time costs and the greater appeal of more proximate opportunities.

Researchers have also sought to improve the ways in which supply and demand are modeled in floating catchment approaches. Previous research has shown that both demand and supply can be inflated/deflated in FCA methods (Delamater 2013; Paez, Higgins, and Vivona 2019; Wan, Zou, and Sternberg 2012). This is a consequence of the overlapping floating catchments that cause the populations in zones \(i\) to be counted multiple times in the calculation of the provider-to-population ratio \(R_j\). These levels-of-service are, in turn, counted multiple times when allocated back to the population zones in the calculation of \(A_i\). In response, Wan et al. propose the use of additional Gaussian weights to modify the binary impedance function used by Luo and Wang (2003). Delamater’s (2013) M2SFCA modifies the second step of the 2SFCA approach by squaring the impedance function to increase the rate of decay on the level of service. This is done to reflect the increased friction population centres may experience when accessing healthcare facilities in sub-optimally configured urban systems.

However, neither of these approaches fully resolves the issue of demand and supply inflation/deflation. To that end, the B2SFCA approach from Páez et al. (2019) that replaces the impedance functions with row-standardized weights \(W_{ij}^{i}\) in the first step:

\[ R_j = \frac{S_j}{\sum_i{P_iW_{ij}^{i}}} \] \[ W_{ij}^{i} = \frac{W_{ij}}{\sum_j W_{ij}} \]

and with column-standardized weights \(W_{ij}^{j}\) in the second step:

\[ A_i = \sum_j{R_jW_{ij}^{j}} \] \[ W_{ij}^{j} = \frac{W_{ij}}{\sum_i W_{ij}} \]

In this formulation, the travel-time weighted populations sum to the original population values and do not deflate the level-of-service at the clinics. By extension, the levels of service available at the population centres are not inflated through multiple counting. For this research, we employ both the 2SFCA and B2SFCA approaches with a negative exponential impedance function:

\[ W_{ij} = e^{-\beta t_{ij}} \]

where \(\beta\) is a parameter that determines the decay of the function and \(t_{ij}\) is the travel time between clinic \(j\) and population centre \(i\). The \(\beta\) parameter is set to 0.05 as this is in the range of typical auto travel time parameters in logit mode choice models calibrated in the Greater Toronto and Hamilton Area.

Utility-based Method

Despite offering balance across both stages of the FCA approach, the B2SFCA results in fractional apportionment of the population and levels-of-service between the population zones and clinics. To address the limitations of existing methods, a novel methodology is developed which assigns trips from population centres to clinics. The general form of this function is as follows:

\[ T_{ij} = f(H_i, Z_j, R_j, t_{ij}, \beta) \]

where:

  • \(T_{ij}\) is the number of trips from zone \(i\) to clinic \(j\)
  • \(H_i\) is the number of households in zone \(i\)
  • \(Z_j\) is the number of doctors at clinic \(j\)
  • \(R_j\) is the demand-to-capacity ratio at clinic \(j\) (note this is inverted from the physician-to-population ratios used in previous FCA approaches)
  • \(t_{ij}\) is the travel time between zones \(i\) and \(j\), and \(\beta\) is a row vector of parameters to be estimated.

To estimate these parameters, information minimization is used as this approach allows for the least-biased parameter estimation and has been proven to be identical to utility maximization (Anas 1983). Based on information minimization theory, the probability that a household in zone i will visit clinic j can be estimated as follows:

\[ MAX_{T_{ij}} E = -\sum_{j \in J} \sum_{i \in I} T_{ij} log(T_{ij}) \]

Subject to the following constraints:

\[ \sum_{j \in J}T_{ij} = \alpha H_i \forall i \in I \] \[ \sum_{i \in I} \sum_{j \in J} T_{ij} t_{ij} = \bar{t}T \] \[ \sum_{i \in I} \sum_{j \in J} T_{ij} log(C_j) = \sum_{i \in I} \sum_{j \in J}T_{ij} log \omega Z_j = \bar{C}T \] \[ \sum_{i \in I} \sum_{j \in J} T_{ij} R_j = \bar{R}T \]

where:

  • \(I\) is the set of all residential zones
  • \(J\) is the set of all clinics
  • \(\alpha\) is the average number of visits to the doctor per household
  • \(\bar{t}\) is the average observed travel time for home-based trips to clinics
  • \(T\) is the total number of daily trips to clinics
  • \(C_j\) is the nominal service capacity at clinic \(j\)
  • \(\omega\) is the average number of patients served by a doctor per day
  • \(\bar{C}\) is the average observed nominal service capacity
  • \(\bar{R}\) is the average observed demand-to-capacity ratio
  • \(H\) is the total number of households
  • \(Z\) is the total number of primary care physicians

The service capacities and demand-to-capacity ratios are calculated as follows:

\[ C_j = \omega Z_j \] \[ R_j = \frac{\sum_{i \in I} T_{ij}}{C_j} = \frac{\sum_{i \in I} T_{ij}}{\omega Z_j} \]

Solving this set of equations yields the following:

\[ T_{ij} = \alpha H_i P_{ij} \]

This is a singly-constrained gravity model where the probability that a household in zone \(i\) will visit clinic \(j\) is as follows:

\[ P_{ij} = \frac{e^{\beta_1 t_{ij} + \beta_{K+2} log \omega Z_j + \beta_{K + 3} R_j}}{\sum_j\prime e^{\beta_1 t_{ij}\prime + \beta_{K+2} log \omega Z_j\prime + \beta_{K + 3} R_j\prime}} \]

Ideally, the \(\beta_1\), \(\beta_{K+2}\), and \(\beta_{K + 3}\) parameters would be estimated iteratively in order to meet the outlined constraints. However, due to a lack of observed data on trips to doctors, these parameters are instead chosen based on the following considerations:

  • The \(\beta_1\) travel time impedance parameter is set to -0.05 based on previous choice models in the region and to align with the 2SFCA and B2SFCA approaches above

  • Random utility theory requires \(\beta_{K+2}\) to lie between 0 to 1 in value. It is set equal to 1 in this case to maximize the attractiveness of larger clinics.

  • No theory is currently available to guide the choice of the \(\beta_{K+3}\) parameter and so -0.5 is chosen as a “first guess” at a parameter value that would produce a reasonable sensitivity to clinic over-crowding, but not prevent over-crowding from occurring

These values ensure that increased travel times and demand-to-capacity ratios reduce the probability that a household in zone \(i\) will visit clinic \(j\), and increased capacity at clinic \(j\) increases the probability.

In order to ensure that \(\bar{R}\) is approximately equal to 1, the \(\alpha\) and \(\omega\) parameters are assumed to be 0.065 visits to the doctor per household and 22 patients seen by a doctor per day, on average, respectively. Since \(R_j\) is a function of \(T_{ij}\) and vice-versa, an iterative approach is taken to estimate the \(R_j\) values. The multonomial logit destination choice model ensures that demand at clinics is not over-estimated, as each patient on average is assigned to a single clinic and is not double counted, as occurs in the 2SFCA method. The end result is an approach that involves location choice modelling by maximizing utility for patients, with clinics with higher demand and longer travel times attracting fewer trips while larger clinics and those closer to the origins attract more trips.

Utility-based Accessibility

As shown by Anas (1983), multinomial logit models are equivalent to gravity models. Following Ben-Akiva and Lerman (Ben-Akiva & Lerman, 1985), accessibility can be defined within random utility theory as the expected maximum utility for a trip. For the multinomial logit model, it can be shown that this is the natural logarithm of the denominator of the logit model (the so-called “logsum” or “inclusive value” term), yielding for this model the following accessibility measure:

\[ a_i = log(\sum_{j\prime} e^{\beta_1 t_{ij}\prime + \beta_{K+2} log \omega Z_j\prime + \beta_{K + 3} R_j\prime}) \]

Study Area

The study area for this research is the City of Hamilton in Ontario, Canada. Based on data from the 2016 Canadian Census of Population, the population of Hamilton is 536,917 living in 211,596 households. Based on the assumed \(\omega = 0.065\) visits to the doctor per household, this results in 13,753.74 trips to the doctor entering the MNL model. The left panel of Figure plots population densities in the Dissemination Area census small geographic units in the City of Hamilton, highlighting that the higher-density urban core is surrounded by lower-density suburbs that extend into land that is largely rural in character.

Information on the count and location of primary care physicians was obtained using the College of Physicians and Surgeons of Ontario’s online registration database. Clinic locations were geocoded based on their address and records were aggregated to count the number of physicians practicing at each unique location. The data for this paper have been used previously in the paper by Páez et al. (2019), although in this case we consider only clinics that are within the spatial extent of the City of Hamilton. While this does introduce edge effects in the calculation of accessibility, limiting the study extent to a closed system permits calculation of the multinomial logit model’s congestion effects and utility-based accessibilities. In total, there are 631 primary care physicians available at clinics in the City of Hamilton in our data. Note that this is not strictly the number of physicians, as some physicians offer services at more than one clinic. Rather, it reflects the availability of physicians at given locations. The right panel of Figure plots the location and total number of available physicians at the clinic locations. This total produces a city-wide average provider-to-population ratio of 117.52 primary care doctors available per 100,000 people. Based on our assumption of \(\alpha = 22\) patients seen per doctor every day, this results in a total capacity of 13,882 patient visits per day in the MNL model formulation.

Results

Demand and Clinic Level of Service

To discuss the results, we begin by focusing on the results associated with how each of the methods calculates demand and levels of service at the clinic locations. The level of service for the FCA approaches is the local provider-to-population ratio for each clinic while the MNL model calculates trip demand-to-patient capacity ratios. To make this comparable, we first take the inverse of the MNL ratios to reflect patient capacity-to-trip demand ratio (CDR). Figure displays a pair plot of the density of each level-of-service statistic and their relationship and correlations with one another. The plot highlights how the 2SFCA and B2SFCA methods significantly differ in the ways in which they allocate demand to the clinics. However, it is interesting to note the relatively high correlation between the population-to-provider ratios at the clinics in the 2SFCA and the capacity-to-demand ratios ratios in the MNL model with the scatterplot revealing some non-linearity in this relationship across the methods.

Figure displays the levels of service for the clinic locations. In general, more urban clinics tend to exhibit higher levels of demand and lower levels of service across all three models. However, the provider-to-population ratios for the individual clinics in the 2SFCA are extremely small compared to results from the B2SFCA model, highlighting how the original method’s multiple counting tends to inflate the (travel time weighted) population numbers in each clinic’s catchment and deflate the level of service available at the clinics. In contrast, the PPRs in the B2SFCA method are readily interpretable as the local ratio of doctors per person for a given clinic considering the (travel-time weighted and apportioned) populations within its catchment. Similarly, the MNL CDRs reflect the relationship between the trip demand and patient capacity based on the assumed rates. In terms of spatial trends, results from the 2SFCA and MNL models suggest both calculate higher levels of service at larger clinics in the urban core as well as at a larger clinic in the city’s rural north-west. In contrast, the B2SFCA method generally produces higher levels of service in an east-to-west direction. This could reflect boundary effects in the study area that omit the large populations present in the rest of the Greater Toronto Area on the northern side of Lake Ontario that may also have access to these clinics by driving.

Healthcare Accessibility

With the levels of service calculated above, the three models then calculate accessibility to healthcare services in Hamilton. Distributions, relationships, and correlations for the accessibility results are shown in Figure . In this case, all three models are highly correlated. The 2SFCA and B2SFCA produce nearly identical ditributions of results, although in the case of the balanced method, the accessibilities correspond to the sum of travel time weighted and apportioned provider-to-population ratios available in the population zones free of the inflation and deflation that occurs in the 2SFCA. In contrast, the scatterplots of the MNL results again highlight some non-linearity in the way the utility-based accessibilities are calculated compared to the FCA methods.

The general spatial trends are similar across all three models (Figure ). The absolute accessibility values differ in accordance with the ways each method calculates its accessibility results. The FCA methods define accessibility based on the physician-to-population ratios of clinics, resulting in smaller values. In contrast, the MNL method defines accessibilities as the logsum of the multinomial logit model, resulting in larger values that have no direct interpretation. In general, the highest accessibilities to primary care physicians correspond to the downtown area of Hamilton, where a large number of clinics are concentrated. Accessibility to physicians generally decreases with increased distance from the downtown area.

To better highlight significant differences in the spatial patterns of accessibility produced by each method, Figure displays the absolute differences in the normalized accessibilities across models. In general, the MNL method tends to produce higher accessibilities for most zones compared to the FCA methods. In line with the distributions above, the 2SFCA and B2SFCA models appear to be most similar, with only slight absolute differences in the calculated accessibility values.

To examine whether there are any spatial patterns in these differences, Figure plots the results of Local Moran’s I tests. To make the values comparable, we first normalize each accessibility vector between 0-1 and take the differences of the normalized values across each approach. Next, the Local Moran’s I is calculated on the differences using queen-style contiguity weights, a critical significance level of \(p=0.05\), and without correcting for multiple testing. The resulting maps reveal some interesting patterns of spatial clustering in the calculated normalized differences, particularly across the two FCA models compared to the MNL model. Here, differences in accessibility are greatest between the FCA and MNL methods in the low-low (LL) cluster in the ring of outer suburbs that surround the city. In contrast, the calculated accessibilities are more consistent across the methods in the high-high (HH) cluster in the central part of the city. Differences in the remaining zones are not significant (NS).

This overall pattern is likely due to the way the MNL approach handles clinic choices with populations tending to select their nearest clinics. On the one hand, the greater accessibilities in more suburban and rural zones likely derived from these populations accessing their closest facility. On the other hand, this also means that fewer individuals from more urban locations are competing for healthcare resources in these more suburban and rural areas, leading to higher levels of service at these suburban and rural clinics. In contrast, the FCA methods allocate populations to all clinics within their catchment area using weights derived from the impedance function. While this produces a smoothing of the accessibilities, it can result in lower levels of service and accessibility for clinics that populations may not actually use. This effect seems to be minimized in more urban locations featuring higher population densities and a greater number of clinics with available physicians. Comparing the normalized results from the 2SFCA and the B2SFCA models, the patterns of spatial clustering in the differences appears to be less associated with the city’s urban-suburban-rural urban structure. While the B2SFCA method generally calculates slightly higher accessibilities across much of the city, the methods are most dissimilar in the south-west rural area.

Discussion and Conclusions

This study develops a multinomial logit destination choice model for calculating transportation accessibility to primary care physicians in the City of Hamilton. This method is compared to the E2SFCA method, and an analysis of the impact of income on accessibility is undertaken using both methods. The accessibility patterns produced by both methods indicate that the highest accessibilities to primary care physicians are in the downtown area of Hamilton. However, the area with the highest accessibilities is much larger with the proposed method, encompassing both the city centre and some suburban areas. The proposed method produces more plausible distributions as compared to the E2SFCA method, as more DAs have either medium to high accessibilities or extremely low accessibilities. In contrast, the E2SFCA method results in many high-access areas despite congested clinics, as well as low-access areas with higher accessibilities than the proposed method despite lower capacities and longer travel times. Overall, the proposed methodology improves upon existing methods, as it addresses all six of the accessibility axioms and does not over-estimate demand. Both the E2SFCA method and the proposed method result in low-income areas having the highest accessibilities. The sensitivity analysis suggests that increased development and increased congestion in the City of Hamilton both result in reduced accessibilities, although the model is more sensitive to the number of households in comparison to travel times. The model can therefore be used to project accessibilities in the future and adjust clinic capacities accordingly. However, more work is required to calibrate the model to better fit observed data and to include non-auto modes of travel.

reframes the calculation of healthcare accessibilities into tripmaking choices. Compared to

FCA approaches consider provider-to-population ratios weighted by distance or travel time as a measure of accessibility to healthcare. In this sense, congestion at clinics is a function of the populations they serve within the travel time window defined by the specification of impedance. The MNL approach reframes the measurement of health accessibility into individual trips to visit primary care physicians, the capacity of physicians to see patients, and congestion effects from the estimated trips. The iterative fitting procedure results in the assignment of

References

Anas, Alex. 1983. “Discrete Choice Theory, Information Theory and the Multinomial Logit and Gravity Models.” Transportation Research Part B: Methodological 17 (1): 13–23. https://doi.org/10.1016/0191-2615(83)90023-1.
Bauer, Jan, and David A. Groneberg. 2016. “Measuring Spatial Accessibility of Health Care Providers Introduction of a Variable Distance Decay Function Within the Floating Catchment Area (FCA) Method.” Edited by Kebede Deribe. PLOS ONE 11 (7): e0159148. https://doi.org/10.1371/journal.pone.0159148.
Dai, Dajun. 2010. “Black Residential Segregation, Disparities in Spatial Access to Health Care Facilities, and Late-Stage Breast Cancer Diagnosis in Metropolitan Detroit.” Health & Place 16 (5): 1038–52. https://doi.org/10.1016/j.healthplace.2010.06.012.
Delamater, Paul L. 2013. “Spatial Accessibility in Suboptimally Configured Health Care Systems: A Modified Two-Step Floating Catchment Area (M2sfca) Metric.” Health & Place 24 (November): 30–43. https://doi.org/10.1016/j.healthplace.2013.07.012.
Geurs, Karst T., and Bert van Wee. 2004. “Accessibility Evaluation of Land-Use and Transport Strategies: Review and Research Directions.” Journal of Transport Geography 12 (2): 127–40. https://doi.org/10.1016/j.jtrangeo.2003.10.005.
Hansen, Walter G. 1959. “How Accessibility Shapes Land Use.” Journal of the American Institute of Planners 25 (2): 73–76. https://doi.org/10.1080/01944365908978307.
Joseph, Alun E., and Peter R. Bantock. 1982. “Measuring Potential Physical Accessibility to General Practitioners in Rural Areas: A Method and Case Study.” Social Science & Medicine 16 (1): 85–90. https://doi.org/10.1016/0277-9536(82)90428-2.
Luo, Wei, and Yi Qi. 2009. “An Enhanced Two-Step Floating Catchment Area (E2sfca) Method for Measuring Spatial Accessibility to Primary Care Physicians.” Health & Place 15 (4): 1100–1107. https://doi.org/10.1016/j.healthplace.2009.06.002.
Luo, Wei, and Fahui Wang. 2003. “Measures of Spatial Accessibility to Health Care in a GIS Environment: Synthesis and a Case Study in the Chicago Region.” Environment and Planning B: Planning and Design 30 (6): 865–84. https://doi.org/10.1068/b29120.
McGrail, Matthew R., and John S. Humphreys. 2009. “Measuring Spatial Accessibility to Primary Care in Rural Areas: Improving the Effectiveness of the Two-Step Floating Catchment Area Method.” Applied Geography 29 (4): 533–41. https://doi.org/10.1016/j.apgeog.2008.12.003.
Paez, Antonio, Christopher D. Higgins, and Salvatore F. Vivona. 2019. “Demand and Level of Service Inflation in Floating Catchment Area (FCA) Methods.” Edited by Tayyab Ikram Shah. PLOS ONE 14 (6): e0218773. https://doi.org/10.1371/journal.pone.0218773.
Radke, John, and Lan Mu. 2000. “Spatial Decompositions, Modeling and Mapping Service Regions to Predict Access to Social Programs.” Annals of GIS 6 (2): 105–12. https://doi.org/10.1080/10824000009480538.
StatsCan. 2019. “Primary Health Care Providers, 2017.” Statistics Canada.
Wan, Neng, Bin Zou, and Troy Sternberg. 2012. “A Three-Step Floating Catchment Area Method for Analyzing Spatial Access to Health Services.” International Journal of Geographical Information Science 26 (6): 1073–89. https://doi.org/10.1080/13658816.2011.624987.
LS0tCnRpdGxlOiAiQWNjZXNzaWJpbGl0eSB0byBQcmltYXJ5IENhcmUgUGh5c2ljaWFuczogQ29tcGFyaW5nIEZsb2F0aW5nIENhdGNobWVudHMgd2l0aCBhIFV0aWxpdHktYmFzZWQgQXBwcm9hY2giCmF1dGhvcjoKICAtIG5hbWU6IE1hcmlhIERlbWl0aXJ5CiAgICBlbWFpbDogbWFyaWEuZGVtaXRpcnlAbWFpbC51dG9yb250by5jYQogICAgYWZmaWxpYXRpb246IFVuaXZlcnNpdHkgb2YgVG9yb250bwogIC0gbmFtZTogQ2hyaXN0b3BoZXIgRC4gSGlnZ2lucwogICAgZW1haWw6IGNkLmhpZ2dpbnNAdXRvcm9udG8uY2EKICAgIGFmZmlsaWF0aW9uOiBVbml2ZXJzaXR5IG9mIFRvcm9udG8gU2NhcmJvcm91Z2gKICAgIGZvb3Rub3RlOiAxCiAgLSBuYW1lOiBBbnRvbmlvIFDDoWV6CiAgICBlbWFpbDogcGFlemhhQG1jbWFzdGVyLmNhCiAgICBhZmZpbGlhdGlvbjogTWNNYXN0ZXIgVW5pdmVyc2l0eQogIC0gbmFtZTogRXJpYyBKLiBNaWxsZXIKICAgIGVtYWlsOiBlcmljLm1pbGxlckB1dG9yb250by5jYQogICAgYWZmaWxpYXRpb246IFVuaXZlcnNpdHkgb2YgVG9yb250bwphZGRyZXNzOgogIC0gY29kZTogVW5pdmVyc2l0eSBvZiBUb3JvbnRvCiAgICBhZGRyZXNzOiBEZXBhcnRtZW50IG9mIENpdmlsIGFuZCBNaW5lcmFsIEVuZ2luZWVyaW5nLCBVbml2ZXJzaXR5IG9mIFRvcm9udG8sIDM1IFN0LiBHZW9yZ2UgU3RyZWV0IFRvcm9udG8sIE9OLiBDYW5hZGEsIE01UyAxQTQgIAogIC0gY29kZTogVW5pdmVyc2l0eSBvZiBUb3JvbnRvIFNjYXJib3JvdWdoCiAgICBhZGRyZXNzOiBEZXBhcnRtZW50IG9mIEh1bWFuIEdlb2dyYXBoeSwgMTI2NSBNaWxpdGFyeSBUcmFpbCwgVG9yb250bywgT04uIENhbmFkYSwgTTFDIDFBNAogIC0gY29kZTogTWNNYXN0ZXIgVW5pdmVyc2l0eQogICAgYWRkcmVzczogU2Nob29sIG9mIEdlb2dyYXBoeSBhbmQgRWFydGggU2NpZW5jZXMsIE1jTWFzdGVyIFVuaXZlcnNpdHksIDEyODAgTWFpbiBTdCBXLCBIYW1pbHRvbiwgT04uIENhbmFkYSwgTDhTIDRLMQpmb290bm90ZToKICAtIGNvZGU6IDEKICAgIHRleHQ6ICJDb3JyZXNwb25kaW5nIEF1dGhvciIKYWJzdHJhY3Q6ICJ0ZXh0IGdvZXMgaGVyZSIKa2V5d29yZHM6CiAgLSBhY2Nlc3NpYmlsaXR5IGFuYWx5c2lzCiAgLSB0ZXh0CiAgLSB0ZXh0CiAgLSB0ZXh0CmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWIKYmlibGlvLXN0eWxlOiB1bnNydApvdXRwdXQ6IAogIHJ0aWNsZXM6OmFyeGl2X2FydGljbGU6CiAgICBrZWVwX3RleDogdHJ1ZQotLS0KCmBgYHtyIGxvYWQgcGFja2FnZXMsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShHR2FsbHkpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoc2YpCmxpYnJhcnkoc3BkZXApCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRtYXApCgojIG9wdGlvbnMKdG1hcF9tb2RlKCJwbG90IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkKYGBgCgpgYGB7ciBjbGVhciBlbnZpcm9ubWVudH0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKYGBge3IgbG9hZCByZXN1bHRzfQpsb2FkKCIuL3Jlc3VsdHMvb3V0cHV0X3dvcmtib29rXzAxLlJEYXRhIikKYGBgCgpgYGB7ciBwcmVwYXJlIGZpZyAxLCBpbmNsdWRlID0gRkFMU0V9CnBvcF9kZW5zX21hcCA8LSB0bV9zaGFwZShvbnRhcmlvX3BvbHksIGJib3ggPSBzdF9iYm94KGRhdGFfZGFfMjAxNl9wb2x5KSkgKyAKICB0bV9maWxsKCJncmV5OTAiKSArCiAgdG1fc2hhcGUoZGF0YV9kYV8yMDE2X3BvbHkpICsgCiAgdG1fZmlsbChjb2wgPSAicG9wZGVucyIsIHBhbGV0dGUgPSAidmlyaWRpcyIsIHN0eWxlID0gImplbmtzIiwgdGl0bGUgPSAiUG9wdWxhdGlvbiBwZXIgSEEiKSAgKwogIHRtX2xheW91dChsZWdlbmQucG9zaXRpb24gPSBjKCJsZWZ0IiwiYm90dG9tIikpICMrdG1fbGF5b3V0KGlubmVyLm1hcmdpbnMgPSBjKDAsMCwwLDApKQoKZG9jdG9yc19tYXAgPC0gdG1fc2hhcGUob250YXJpb19wb2x5LCBiYm94ID0gc3RfYmJveChkYXRhX2RhXzIwMTZfcG9seSkpICsgCiAgdG1fZmlsbCgiZ3JleTkwIikgKwogIHRtX3NoYXBlKGRhdGFfZGFfMjAxNl9wb2x5KSArIAogIHRtX2ZpbGwoImdyZXk3NSIpICsKICB0bV9zaGFwZShkb2N0b3JzKSArIAogIHRtX2J1YmJsZXMoc2l6ZSA9ICJkb2N0b3JfY291bnQiLCAKICAgICAgICAgICAgIGNvbCA9ICJkb2N0b3JfY291bnQiLCAKICAgICAgICAgICAgIHBhbGV0dGUgPSAidmlyaWRpcyIsIAogICAgICAgICAgICAgc3R5bGUgPSAiamVua3MiLCAKICAgICAgICAgICAgIHRpdGxlLnNpemUgPSAiRmFtaWx5IFBoeXNpY2lhbnMiLCAKICAgICAgICAgICAgIHRpdGxlLmNvbCA9ICIiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5wb3NpdGlvbiA9IGMoImxlZnQiLCJib3R0b20iKSkgIyt0bV9sYXlvdXQoaW5uZXIubWFyZ2lucyA9IGMoMCwwLDAsMCkpCgpzdHVkeV9hcmVhX21hcCA8LSB0bWFwX2FycmFuZ2UocG9wX2RlbnNfbWFwLCBkb2N0b3JzX21hcCwgbnJvdyA9IDEsIG91dGVyLm1hcmdpbnMgPSBjKDAsIDAsIDAsIDApKQp0bWFwX3NhdmUoc3R1ZHlfYXJlYV9tYXAsIGZpbGVuYW1lID0gIi4vaW1nL3N0dWR5X2FyZWFfbWFwLmpwZyIsIGRwaSA9IDYwMCwgd2lkdGggPSA5LCBoZWlnaHQgPSA0LjUpCmBgYAoKYGBge3IgcHJlcGFyZSBwYWlyIHBsb3RzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBsb3dlciB0cmlhbmdsZSBjdXN0b20gZnVuY3Rpb24KbG93ZXJmdW4gPC0gZnVuY3Rpb24oZGF0YSxtYXBwaW5nKXsKICBnZ3Bsb3QoZGF0YSA9IGRhdGEsIG1hcHBpbmcgPSBtYXBwaW5nKSArCiAgICBnZW9tX3Ntb290aChtZXRob2Q9J2xtJywgZm9ybXVsYT0geX54LCBjb2xvdXI9ImJsYWNrIiwgc2l6ZSA9IC41KSArCiAgICBnZW9tX3BvaW50KGFscGhhID0gMC4zLCBzaXplID0gMC4yLCBjb2xvciA9ICJncmF5MzUiKX0KCiMgZGlhZ29uYWwgZWxlbWVudCBjdXN0b20gZnVuY3Rpb24KZGlhZ2Z1biA8LSBmdW5jdGlvbihkYXRhLCBtYXBwaW5nKSB7CiAgZ2dwbG90KGRhdGEgPSBkYXRhLCBtYXBwaW5nPW1hcHBpbmcpICsKICAgIGdlb21fZGVuc2l0eShmaWxsID0gImdyYXkiKX0KCiMgY2FsY3VsYXRlIGNhcGFjaXR5LXRvLWRlbWFuZCByYXRpbyBmb3IgTU5MIHJlc3VsdHMKZG9jdG9ycyAlPD4lIG11dGF0ZShtbmxfY2RyID0gMS9tbmxfZGNyKQoKcGFpcl9wbG90X3BwciA8LSBnZ3BhaXJzKGRvY3RvcnMgJT4lIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUgZHJvcF9uYSgpLCAKICAgICAgICBjb2x1bW5zID0gYygiZmNhX3BwciIsICJiZmNhX3BwciIsICJtbmxfY2RyIiksIHhsYWIgPSAiTGV2ZWwgb2YgU2VydmljZSBSYXRpb3MiLCAKICAgICAgICBkaWFnID0gbGlzdChjb250aW51b3VzID0gd3JhcChkaWFnZnVuKSksCiAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKGxvd2VyZnVuKSksCiAgICAgICAgY29sdW1uTGFiZWxzID0gYygiMlNGQ0EiLCAiQjJTRkNBIiwgIk1OTCIpKQoKcGFpcl9wbG90X2FjY2VzcyA8LSBnZ3BhaXJzKGRhdGFfZGFfMjAxNl9wb2x5ICU+JSBzdF9kcm9wX2dlb21ldHJ5KCkgJT4lIGRyb3BfbmEoKSwgCiAgICAgICAgY29sdW1ucyA9IDEyOjE0LCB4bGFiID0gIkFjY2Vzc2liaWxpdHkiLCAKICAgICAgICBkaWFnID0gbGlzdChjb250aW51b3VzID0gd3JhcChkaWFnZnVuKSksCiAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKGxvd2VyZnVuKSksCiAgICAgICAgY29sdW1uTGFiZWxzID0gYygiMlNGQ0EiLCAiQjJTRkNBIiwgIk1OTCIpKQoKIyBzYXZlCmdnc2F2ZShwYWlyX3Bsb3RfcHByLCBmaWxlbmFtZSA9ICIuL2ltZy9wYWlyX3Bsb3RfcHByLmpwZyIsIGRldmljZSA9ICJqcGVnIiwgZHBpID0gNjAwLCBoZWlnaHQgPSA0LCB3aWR0aCA9IDcpCmdnc2F2ZShwYWlyX3Bsb3RfYWNjZXNzLCBmaWxlbmFtZSA9ICIuL2ltZy9wYWlyX3Bsb3RfYWNjZXNzLmpwZyIsIGRldmljZSA9ICJqcGVnIiwgZHBpID0gNjAwLCBoZWlnaHQgPSA0LCB3aWR0aCA9IDcpCmBgYAoKYGBge3IgcHJlcGFyZSBsb3NfbWFwcywgaW5jbHVkZSA9IEZBTFNFfQpsb3NfbWFwX2ZjYSA8LSB0bV9zaGFwZShvbnRhcmlvX3BvbHksIGJib3ggPSBzdF9iYm94KGRhdGFfZGFfMjAxNl9wb2x5KSkgKyAKICB0bV9maWxsKCJncmV5OTAiKSArCiAgdG1fc2hhcGUoZGF0YV9kYV8yMDE2X3BvbHkpICsgCiAgdG1fZmlsbCgiZ3JleTc1IikgKwogIHRtX3NoYXBlKGRvY3RvcnMpICsgCiAgdG1fYnViYmxlcyhzaXplID0gImZjYV9wcHIiLCAKICAgICAgICAgICAgIHNjYWxlID0gLjYsCiAgICAgICAgICAgICAjbiA9IDQsCiAgICAgICAgICAgICBjb2wgPSAiZmNhX3BwciIsIAogICAgICAgICAgICAgcGFsZXR0ZSA9ICJ2aXJpZGlzIiwgCiAgICAgICAgICAgICBzdHlsZSA9ICJqZW5rcyIsIAogICAgICAgICAgICAgdGl0bGUuc2l6ZSA9ICIyU0ZDQSBQUFIiLCAKICAgICAgICAgICAgIHRpdGxlLmNvbCA9ICIiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5wb3NpdGlvbiA9IGMoImxlZnQiLCJib3R0b20iKSkKCmxvc19tYXBfYmZjYSA8LSB0bV9zaGFwZShvbnRhcmlvX3BvbHksIGJib3ggPSBzdF9iYm94KGRhdGFfZGFfMjAxNl9wb2x5KSkgKyAKICB0bV9maWxsKCJncmV5OTAiKSArCiAgdG1fc2hhcGUoZGF0YV9kYV8yMDE2X3BvbHkpICsgCiAgdG1fZmlsbCgiZ3JleTc1IikgKwogIHRtX3NoYXBlKGRvY3RvcnMpICsgCiAgdG1fYnViYmxlcyhzaXplID0gImJmY2FfcHByIiwgCiAgICAgICAgICAgICBzY2FsZSA9IC42LAogICAgICAgICAgICAgI24gPSA0LAogICAgICAgICAgICAgY29sID0gImJmY2FfcHByIiwgCiAgICAgICAgICAgICBwYWxldHRlID0gInZpcmlkaXMiLCAKICAgICAgICAgICAgIHN0eWxlID0gImplbmtzIiwgCiAgICAgICAgICAgICB0aXRsZS5zaXplID0gIkIyU0ZDQSBQUFIiLCAKICAgICAgICAgICAgIHRpdGxlLmNvbCA9ICIiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5wb3NpdGlvbiA9IGMoImxlZnQiLCJib3R0b20iKSkKCmxvc19tYXBfbW5sIDwtIHRtX3NoYXBlKG9udGFyaW9fcG9seSwgYmJveCA9IHN0X2Jib3goZGF0YV9kYV8yMDE2X3BvbHkpKSArIAogIHRtX2ZpbGwoImdyZXk5MCIpICsKICB0bV9zaGFwZShkYXRhX2RhXzIwMTZfcG9seSkgKyAKICB0bV9maWxsKCJncmV5NzUiKSArCiAgdG1fc2hhcGUoZG9jdG9ycykgKyAKICB0bV9idWJibGVzKHNpemUgPSAibW5sX2NkciIsIAogICAgICAgICAgICAgc2NhbGUgPSAuNiwKICAgICAgICAgICAgICNuID0gNCwKICAgICAgICAgICAgIGNvbCA9ICJtbmxfY2RyIiwgCiAgICAgICAgICAgICBwYWxldHRlID0gInZpcmlkaXMiLCAKICAgICAgICAgICAgIHN0eWxlID0gImplbmtzIiwgCiAgICAgICAgICAgICB0aXRsZS5zaXplID0gIk1OTCBDRFIiLCAKICAgICAgICAgICAgIHRpdGxlLmNvbCA9ICIiKSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5wb3NpdGlvbiA9IGMoImxlZnQiLCJib3R0b20iKSkKCmxvc19tYXBzIDwtIHRtYXBfYXJyYW5nZShsb3NfbWFwX2ZjYSwgbG9zX21hcF9iZmNhLCBsb3NfbWFwX21ubCwgbnJvdyA9IDEsIG91dGVyLm1hcmdpbnMgPSBjKDAsIDAsIDAsIDApKQp0bWFwX3NhdmUobG9zX21hcHMsIGZpbGVuYW1lID0gIi4vaW1nL2xvc19tYXBzLmpwZyIsIGRwaSA9IDYwMCwgd2lkdGggPSA5LCBoZWlnaHQgPSA0KQpgYGAKCmBgYHtyIGFjY2VzcyBtYXBzLCBpbmNsdWRlID0gRkFMU0V9CmFjY2Vzc19tYXBfZmNhIDwtIHRtX3NoYXBlKG9udGFyaW9fcG9seSwgYmJveCA9IHN0X2Jib3goZGF0YV9kYV8yMDE2X3BvbHkpKSArIAogIHRtX2ZpbGwoImdyZXk5MCIpICsKICB0bV9zaGFwZShkYXRhX2RhXzIwMTZfcG9seSkgKyAKICB0bV9maWxsKGNvbCA9ICJmY2FfYWNjZXNzIiwgcGFsZXR0ZSA9ICJ2aXJpZGlzIiwgc3R5bGUgPSAiamVua3MiLCB0aXRsZSA9ICIyU0ZDQVxuQWNjZXNzaWJpbGl0eSIpICArCiAgdG1fbGF5b3V0KGxlZ2VuZC5wb3NpdGlvbiA9IGMoImxlZnQiLCJib3R0b20iKSkKCmFjY2Vzc19tYXBfYmZjYSA8LSB0bV9zaGFwZShvbnRhcmlvX3BvbHksIGJib3ggPSBzdF9iYm94KGRhdGFfZGFfMjAxNl9wb2x5KSkgKyAKICB0bV9maWxsKCJncmV5OTAiKSArCiAgdG1fc2hhcGUoZGF0YV9kYV8yMDE2X3BvbHkpICsgCiAgdG1fZmlsbChjb2wgPSAiYmZjYV9hY2Nlc3MiLCBwYWxldHRlID0gInZpcmlkaXMiLCBzdHlsZSA9ICJqZW5rcyIsIHRpdGxlID0gIkIyU0ZDQVxuQWNjZXNzaWJpbGl0eSIpICArCiAgdG1fbGF5b3V0KGxlZ2VuZC5wb3NpdGlvbiA9IGMoImxlZnQiLCJib3R0b20iKSkKCmFjY2Vzc19tYXBfbW5sIDwtIHRtX3NoYXBlKG9udGFyaW9fcG9seSwgYmJveCA9IHN0X2Jib3goZGF0YV9kYV8yMDE2X3BvbHkpKSArIAogIHRtX2ZpbGwoImdyZXk5MCIpICsKICB0bV9zaGFwZShkYXRhX2RhXzIwMTZfcG9seSkgKyAKICB0bV9maWxsKGNvbCA9ICJtbmxfYWNjZXNzIiwgcGFsZXR0ZSA9ICJ2aXJpZGlzIiwgc3R5bGUgPSAiamVua3MiLCB0aXRsZSA9ICJNTkxcbkFjY2Vzc2liaWxpdHkiKSAgKwogIHRtX2xheW91dChsZWdlbmQucG9zaXRpb24gPSBjKCJsZWZ0IiwiYm90dG9tIikpCgphY2Nlc3NfbWFwcyA8LSB0bWFwX2FycmFuZ2UoYWNjZXNzX21hcF9mY2EsIGFjY2Vzc19tYXBfYmZjYSwgYWNjZXNzX21hcF9tbmwsIG5yb3cgPSAxLCBvdXRlci5tYXJnaW5zID0gYygwLCAwLCAwLCAwKSkKdG1hcF9zYXZlKGFjY2Vzc19tYXBzLCBmaWxlbmFtZSA9ICIuL2ltZy9hY2Nlc3NfbWFwcy5qcGciLCBkcGkgPSA2MDAsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNCkKYGBgCgpgYGB7ciBkZWZpbmUgZnVuY3Rpb25zfQojIGNyZWF0ZSBsb2NhbCBtb3JhbiBjbGFzc2lmaWVyIGZ1bmN0aW9uCmxvY2FsX21vcmFuX2NsYXNzaWZpZXIgPC0gZnVuY3Rpb24oaW5wdXRfdmFyLCBwX3ZhbHVlLCB3X21hdHJpeCl7CiAgc192YXIgPSBhcy52ZWN0b3Ioc2NhbGUoaW5wdXRfdmFyKSkKICB3X3ZhciA9IGxhZy5saXN0dyh3X21hdHJpeCwgdmFyID0gc192YXIpCiAgY2xhc3NpZmllZCA9IGlmZWxzZShzX3ZhciA+IDAgJiB3X3ZhciA+IDAgJiBwX3ZhbHVlIDw9MC4wNSwgIkhIIiwKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc192YXIgPD0gMCAmIHdfdmFyIDw9IDAgJiBwX3ZhbHVlIDw9MC4wNSwgIkxMIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNfdmFyID4gMCAmIHdfdmFyIDw9IDAgJiBwX3ZhbHVlIDw9MC4wNSwgIkhMIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzX3ZhciA8PSAwICYgd192YXIgPiAwICYgcF92YWx1ZSA8PTAuMDUsICJMSCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5TIikpKSkKICByZXR1cm4oY2xhc3NpZmllZCkgCn0KCiMgbG9jYWwgbW9yYW4gY2xhc3NpZmljYXRpb24gY29sb3VyIHBhbGV0dGUKbG9jbV9wYWxldHRlIDwtIGMoIiNFMDhDODAiLCAiIzdCQjBEMiIsICIjRjlGOUY5IikKCiMgbm9ybWFsaXplIGZ1bmN0aW9uCm5vcm1feCA8LSBmdW5jdGlvbih4KXsKICBuX3ggPSAoeCAtIG1pbih4LCBuYS5ybSA9IFRSVUUpKS8obWF4KHgsIG5hLnJtID0gVFJVRSkgLSBtaW4oeCwgbmEucm0gPSBUUlVFKSkKICByZXR1cm4obl94KQp9CmBgYAoKYGBge3J9CiMgcHJlcGFyZSBkYXRhIGJ5IHRha2luZyBkaWZmZXJlbmNlcwpkYV9wb2x5IDwtIGRhdGFfZGFfMjAxNl9wb2x5ICU+JSAKICBzZWxlY3QoR2VvVUlELCBmY2FfYWNjZXNzLCBiZmNhX2FjY2VzcywgbW5sX2FjY2VzcywgZ2VvbWV0cnkpICU+JSAKICBkcm9wX25hKG1ubF9hY2Nlc3MpICU+JQogIG11dGF0ZShuX2ZjYV9hY2Nlc3MgPSBub3JtX3goZmNhX2FjY2VzcyksCiAgICAgICAgIG5fYmZjYV9hY2Nlc3MgPSBub3JtX3goYmZjYV9hY2Nlc3MpLAogICAgICAgICBuX21ubF9hY2Nlc3MgPSBub3JtX3gobW5sX2FjY2VzcyksCiAgICAgICAgIGRpZmZfZmNhX2JmY2EgPSBuX2ZjYV9hY2Nlc3MgLSBuX2JmY2FfYWNjZXNzLAogICAgICAgICBkaWZmX2ZjYV9tbmwgPSBuX2ZjYV9hY2Nlc3MgLSBuX21ubF9hY2Nlc3MsCiAgICAgICAgIGRpZmZfYmZjYV9tbmwgPSBuX2JmY2FfYWNjZXNzIC0gbl9tbmxfYWNjZXNzKQoKZGlmZl9saXN0IDwtIGMoImRpZmZfZmNhX2JmY2EiLCAiZGlmZl9mY2FfbW5sIiwgImRpZmZfYmZjYV9tbmwiKQoKIyBnZXQgc3BhdGlhbCB3ZWlnaHRzCmRhX3BvbHlfcXVlZW4gPC0gcG9seTJuYihwbCA9IGRhX3BvbHksIHF1ZWVuPVRSVUUpCmRhX3BvbHlfcXVlZW5fVyA8LSBuYjJsaXN0dyhuZWlnaGJvdXJzID0gZGFfcG9seV9xdWVlbiwgc3R5bGUgPSAiVyIpCmBgYAoKYGBge3IgbW9yYW4gY2xhc3NpZmljYXRpb259CiMgZ2V0IGxvY2FsIG1vcmFuJ3MgSSBwLXZhbHVlcwpsbXB2X2xpc3QgPC0gbGlzdCgpCmZvciAoaSBpbiBkaWZmX2xpc3QpewogIGxvY2FsX20gPC0gYXMuZGF0YS5mcmFtZShsb2NhbG1vcmFuKHggPSBkYV9wb2x5W1tpXV0sIGxpc3R3ID0gZGFfcG9seV9xdWVlbl9XKSkKICAjIGNyZWF0ZSBuZXcgdmFyaWFibGUgbmFtZSBmb3IgcCB2YWx1ZSBhbmQgcmVuYW1lCiAgcHZfdmFybmFtZSA9IHBhc3RlMCgibG1wdl8iLCBpKQogIGxvY2FsX20gPC0gbG9jYWxfbSAlPiUgcmVuYW1lKCEhcHZfdmFybmFtZSA6PSBgUHIoeiA+IDApYCkgJT4lIHNlbGVjdCghIXB2X3Zhcm5hbWUpCiAgbG1wdl9saXN0W1tpXV0gPC0gbG9jYWxfbX0KCiMgY2JpbmQgdG8gdGhlIG9yaWdpbmFsIGRhIHBvbHlzCmRhX3BvbHkgJTw+JSBjYmluZChiaW5kX2NvbHMobG1wdl9saXN0KSkKCiMgY2xhc3NpZnkgcCB2YWx1ZXMKbG1fY2xhc3NfbGlzdCA8LSBsaXN0KCkKZm9yIChpIGluIGRpZmZfbGlzdCl7CiAgI2lucHV0X3Zhcm5hbWUgPSAKICBwdl92YXJuYW1lID0gcGFzdGUwKCJsbXB2XyIsIGkpCiAgb3V0X3Zhcm5hbWUgPC0gcGFzdGUwKCJsbWNfIiwgaSkKICBsbV9jbGFzcyA8LSBkYV9wb2x5ICU+JSAKICAgIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUgCiAgICBtdXRhdGUoISFvdXRfdmFybmFtZSA6PSBsb2NhbF9tb3Jhbl9jbGFzc2lmaWVyKC5kYXRhW1tpXV0sIGdldChwdl92YXJuYW1lKSwgZGFfcG9seV9xdWVlbl9XKSkKICBsbV9jbGFzc19saXN0W1tpXV0gPC0gbG1fY2xhc3MgJT4lIHNlbGVjdCghIW91dF92YXJuYW1lKQp9CgojIGNiaW5kIHRvIHRoZSBvcmlnaW5hbCBkYSBwb2x5cwpkYV9wb2x5ICU8PiUgY2JpbmQoYmluZF9jb2xzKGxtX2NsYXNzX2xpc3QpKSAKYGBgCgpgYGB7ciBhY2Nlc3MgZGlmZiBtYXBzLCBpbmNsdWRlID0gRkFMU0V9CiMgY29udmVydCB0byBsb25nIGZvcm1hdApkYV9wb2x5X2RpZmZfbG9uZyA8LSBkYV9wb2x5ICU+JQogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZGlmZiIpLCBuYW1lc190byA9ICJuYW1lIiwgdmFsdWVzX3RvID0gInZhbHVlcyIpICU+JSAKICBtdXRhdGUobmFtZSA9IGZjdF9yZWxldmVsKG5hbWUsICJkaWZmX2ZjYV9iZmNhIiwgImRpZmZfZmNhX21ubCIsICJkaWZmX2JmY2FfbW5sIikpICU+JQogIHN0X3NmKCkKICAgICAgICAgICAgICAgIAphY2Nlc3NfZGlmZl9tYXBzIDwtIHRtX3NoYXBlKG9udGFyaW9fcG9seSwgYmJveCA9IHN0X2Jib3goZGF0YV9kYV8yMDE2X3BvbHkpKSArIAogIHRtX2ZpbGwoImdyZXk5MCIpICsKICB0bV9zaGFwZShkYV9wb2x5X2RpZmZfbG9uZykgKwogIHRtX2ZpbGwoY29sID0gInZhbHVlcyIsIAogICAgICAgICAgYWxwaGEgPSAuNzUsIAogICAgICAgICAgI3N0eWxlID0gJ2ZpeGVkJywgCiAgICAgICAgICAjYnJlYWtzID0gZGl2X2JyZWFrcywgCiAgICAgICAgICBwYWxldHRlID0gIi1SZEJ1IiwKICAgICAgICAgIG1pZHBvaW50ID0gMCwKICAgICAgICAgIHRpdGxlID0gIiIsICMiQWNjZXNzaWJpbGl0eSBEaWZmZXJlbmNlIEhvdCBTcG90cyIsCiAgICAgICAgICBsZWdlbmQuaXMucG9ydHJhaXQ9RkFMU0UpICsKICB0bV9mYWNldHMoIm5hbWUiLCBucm93ID0gMSkgKwogIHRtX2xheW91dChiZy5jb2xvciA9ICJncmV5OTUiLCAKICAgICAgICAgICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgICAgICAgICBsZWdlbmQub3V0c2lkZS5wb3NpdGlvbiA9IGMoImJvdHRvbSIpLAogICAgICAgICAgICBsZWdlbmQub3V0c2lkZS5zaXplID0gLjEsCiAgICAgICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAuMDEsIDEpLAogICAgICAgICAgICAjbGVnZW5kLnN0YWNrID0gImhvcml6b250YWwiLAogICAgICAgICAgICBiZXR3ZWVuLm1hcmdpbiA9IDAuMSwKICAgICAgICAgICAgcGFuZWwubGFiZWxzID0gYygiMlNGQ0EgLSBCMlNGQ0EiLCAiMlNGQ0EgLSBNTkwiLCAiQjJTRkNBIC0gTU5MIiksCiAgICAgICAgICAgIHBhbmVsLmxhYmVsLmJnLmNvbG9yID0gTkEsCiAgICAgICAgICAgIHBhbmVsLmxhYmVsLnNpemUgPSAuNzUpCgp0bWFwX3NhdmUoYWNjZXNzX2RpZmZfbWFwcywgZmlsZW5hbWUgPSAiLi9pbWcvYWNjZXNzX2RpZmZfbWFwcy5qcGciLCBkcGkgPSA2MDAsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNCkKYGBgCgpgYGB7ciBsb2NhbCBtb3JhbiBtYXBzLCBpbmNsdWRlID0gRkFMU0V9CmRhX3BvbHlfbG1jX2xvbmcgPC0gZGFfcG9seSAlPiUKICBwaXZvdF9sb25nZXIoc3RhcnRzX3dpdGgoImxtYyIpLCBuYW1lc190byA9ICJuYW1lIiwgdmFsdWVzX3RvID0gInZhbHVlcyIpICU+JSAKICBtdXRhdGUobmFtZSA9IGZjdF9yZWxldmVsKG5hbWUsICJsbWNfZGlmZl9mY2FfYmZjYSIsICJsbWNfZGlmZl9mY2FfbW5sIiwgImxtY19kaWZmX2JmY2FfbW5sIikpICU+JQogIHN0X3NmKCkKCmFjY2Vzc19sb2NtX21hcHMgPC0gdG1fc2hhcGUob250YXJpb19wb2x5LCBiYm94ID0gc3RfYmJveChkYXRhX2RhXzIwMTZfcG9seSkpICsgCiAgdG1fZmlsbCgiZ3JleTkwIikgKwogIHRtX3NoYXBlKGRhX3BvbHlfbG1jX2xvbmcpICsKICB0bV9maWxsKGNvbCA9ICJ2YWx1ZXMiLCAKICAgICAgICAgIGFscGhhID0gLjc1LCAKICAgICAgICAgICNzdHlsZSA9ICdmaXhlZCcsIAogICAgICAgICAgI2JyZWFrcyA9IGRpdl9icmVha3MsIAogICAgICAgICAgcGFsZXR0ZSA9IGxvY21fcGFsZXR0ZSwgCiAgICAgICAgICB0aXRsZSA9ICIiLCAjIkFjY2Vzc2liaWxpdHkgRGlmZmVyZW5jZSBIb3QgU3BvdHMiLAogICAgICAgICAgbGVnZW5kLmlzLnBvcnRyYWl0PUZBTFNFKSArCiAgdG1fZmFjZXRzKCJuYW1lIiwgbnJvdyA9IDEpICsKICB0bV9sYXlvdXQoYmcuY29sb3IgPSAiZ3JleTk1IiwgCiAgICAgICAgICAgIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwKICAgICAgICAgICAgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSBjKCJib3R0b20iKSwKICAgICAgICAgICAgbGVnZW5kLm91dHNpZGUuc2l6ZSA9IC4xLAogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuMDEsIDEpLAogICAgICAgICAgICAjbGVnZW5kLnN0YWNrID0gImhvcml6b250YWwiLAogICAgICAgICAgICBiZXR3ZWVuLm1hcmdpbiA9IDAuMSwKICAgICAgICAgICAgcGFuZWwubGFiZWxzID0gYygiMlNGQ0EgLSBCMlNGQ0EiLCAiMlNGQ0EgLSBNTkwiLCAiQjJTRkNBIC0gTU5MIiksCiAgICAgICAgICAgIHBhbmVsLmxhYmVsLmJnLmNvbG9yID0gTkEsCiAgICAgICAgICAgIHBhbmVsLmxhYmVsLnNpemUgPSAuNzUpCgp0bWFwX3NhdmUoYWNjZXNzX2xvY21fbWFwcywgZmlsZW5hbWUgPSAiLi9pbWcvYWNjZXNzX2xvY21fbWFwcy5qcGciLCBkcGkgPSA2MDAsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNCkKYGBgCgojIEludHJvZHVjdGlvbgoKVGhlIENPVklELTE5IGdsb2JhbCBwYW5kZW1pYyBoYXMgZW1waGFzaXplZCB0aGUgaW1wb3J0YW5jZSBvZiBoZWFsdGhjYXJlIGFjY2Vzc2liaWxpdHksIHBhcnRpY3VsYXJseSBhY2Nlc3MgdG8gcHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMsIHdobyBwcm92aWRlIHRoZSBmaXJzdCBwb2ludCBvZiBjb250YWN0IGJldHdlZW4gcGF0aWVudHMgYW5kIHRoZSBoZWFsdGhjYXJlIHN5c3RlbS4gSW4gQ2FuYWRhLCB0aGUgQ2FuYWRhIEhlYWx0aCBBY3Qgc3RhdGVzIHRoYXQgYWxsIHJlc2lkZW50cyBzaG91bGQgaGF2ZSAicmVhc29uYWJsZSBhY2Nlc3MiIHRvIGhlYWx0aGNhcmUuIEhvd2V2ZXIsIHRoZSAyMDE3IENhbmFkaWFuIENvbW11bml0eSBIZWFsdGggU3VydmV5IHJldmVhbGVkIHRoYXQgMTUuMyUgb2YgQ2FuYWRpYW5zIGFnZWQgMTIgb3Igb3ZlciBkaWQgbm90IGhhdmUgYSBwcmltYXJ5IGNhcmUgcGh5c2ljaWFuLCBvZiB3aG9tIDE3LjIlIHN0YXRlZCB0aGF0IHRoZXJlIGlzIG5vIHBoeXNpY2lhbiBhY2Nlc3NpYmxlIHdpdGhpbiB0aGVpciBhcmVhIFtAc3RhdGNhbjIwMTldLgoKQWNjZXNzaWJpbGl0eSB0byBoZWFsdGhjYXJlIHNlcnZpY2VzIGlzIGRlZmluZWQgYnkgYm90aCBzcGF0aWFsIGFuZCBhc3BhdGlhbCBjb21wb25lbnRzIFtAam9zZXBoMTk4Ml0uIEFzcGF0aWFsIGZhY3RvcnMgaW5jbHVkZSB0aGUgY29zdCBhbmQgcXVhbGl0eSBvZiBoZWFsdGhjYXJlIHNlcnZpY2VzIGFuZCB0aGUgc29jaW9lY29ub21pYywgZGVtb2dyYXBoaWMsIGFuZCBtb2JpbGl0eSBwcm9maWxlIG9mIHBvdGVudGlhbCB1c2VycyBbQGpvc2VwaDE5ODJdLiBUaGUgc2Vjb25kIGNvbXBvbmVudCBjb25zaWRlcnMgZ2VvZ3JhcGhpYyBhY2Nlc3NpYmlsaXR5LCB3aGljaCBjYW4gYmUgZGVmaW5lZCBhcyB0aGUgcG90ZW50aWFsIHRvIGludGVyYWN0IHdpdGggYSBnaXZlbiBzZXQgb2Ygb3Bwb3J0dW5pdGllcywgc3VjaCBhcyBoZWFsdGhjYXJlIGZhY2lsaXRpZXMgb3IgcHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMsIGZyb20gYSBnaXZlbiBsb2NhdGlvbiB1c2luZyB0aGUgdHJhbnNwb3J0YXRpb24gbmV0d29yayBbQGhhbnNlbjE5NTldLiBBY2Nlc3NpYmlsaXR5IHRvIGhlYWx0aGNhcmUgY2FuIHRoZXJlZm9yZSBiZSBpbXByb3ZlZCB0aHJvdWdoIGVpdGhlciBhbiBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBvcHBvcnR1bml0aWVzIG9yIHRocm91Z2ggaW1wcm92ZW1lbnRzIHRvIHRoZSB0cmFuc3BvcnRhdGlvbiBuZXR3b3JrLgoKSW4gZ2VuZXJhbCwgZm91ciBhcHByb2FjaGVzIGZvciBjYWxjdWxhdGluZyBhY2Nlc3NpYmlsaXR5IGV4aXN0OiBpbmZyYXN0cnVjdHVyZS1iYXNlZCBhcHByb2FjaGVzLCB3aGljaCBmb2N1cyBvbiB0aGUgY2FwYWNpdHkgb2YgdHJhbnNwb3J0YXRpb24gaW5mcmFzdHJ1Y3R1cmU7IGxvY2F0aW9uLWJhc2VkIGFwcHJvYWNoZXMsIHdoaWNoIGZvY3VzIG9uIHNwYXRpYWwgZGlzdHJpYnV0aW9ucyBvZiBvcHBvcnR1bml0aWVzOyBwZXJzb24tYmFzZWQgYXBwcm9hY2hlcywgd2hpY2ggZm9jdXMgb24gYWNjZXNzaWJpbGl0eSBvbiBhbiBpbmRpdmlkdWFsIGxldmVsOyBhbmQgdXRpbGl0eS1iYXNlZCBtZWFzdXJlcywgd2hpY2ggZm9jdXMgb24gdGhlIHV0aWxpdHkgZGVyaXZlZCBmcm9tIGludGVyYWN0aW5nIHdpdGggdGhlIG9wcG9ydHVuaXR5IG9yIHBhcnRpY2lwYXRpbmcgaW4gYW4gYWN0aXZpdHkgW0BnZXVyczIwMDRdLiBPZiB0aGVzZSwgcGxhY2UtYmFzZWQgbWVhc3VyZXMgYXJlIHRoZSBtb3N0IGNvbW1vbiBpbiB0aGUgbGl0ZXJhdHVyZSBhbmQsIG9mIHRoZXNlLCB0aGUgZmFtaWx5IG9mICJmbG9hdGluZyBjYXRjaG1lbnQgYXJlYSIgKEZDQSkgbWV0aG9kcyBpcyBvbmUgb2YgdGhlIG1vc3QgcG9wdWxhciBhcHByb2FjaGVzIGZvciBjYWxjdWxhdGluZyBwbGFjZS1iYXNlZCBoZWFsdGhjYXJlIGFjY2Vzc2liaWxpdHkuIEJlY2F1c2UgaGVhbHRoY2FyZSBhY2Nlc3MgaXMgc2Vuc2l0aXZlIHRvIGRlbWFuZCBhbmQgc3VwcGx5LCBMdW8gYW5kIFdhbmcgW0BsdW8yMDAzXSAoZHJhd2luZyBvbiBSYWRrZSBhbmQgTXUgWy1AcmFka2UyMDAwXSkgaW50cm9kdWNlZCB0aGUgVHdvLXN0ZXAgRmxvYXRpbmcgQ2F0Y2htZW50IEFyZWEgKDJTRkNBKSBtZXRob2QgdGhhdCBmaXJzdCBlc3RpbWF0ZXMgdGhlIGRlbWFuZCBmb3IgaGVhbHRoY2FyZSBhdCBzZXJ2aWNlIGxvY2F0aW9ucyBmcm9tIHBvcHVsYXRpb24gem9uZXMgYW5kIHRoZW4gYWxsb2NhdGVzIHRoZSBsZXZlbCBvZiBzZXJ2aWNlIGJhY2sgdG8gdGhlIHBvcHVsYXRpb24gem9uZXMgdXNpbmcgYSBiaW5hcnkgbWVhc3VyZSBvZiB0cmF2ZWwgaW1wZWRhbmNlLgoKU2luY2UgdGhlbiwgdmFyaW91cyBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIDJTRkNBIGFwcHJvYWNoIHRvIGJldHRlciBjYXB0dXJlIHRoZSBmcmljdGlvbiBvZiBkaXN0YW5jZS4gVGhlIG9yaWdpbmFsIDJTRkNBIGhhcyBiZWVuIGNyaXRpY2l6ZWQgZm9yIG92ZXItZXN0aW1hdGluZyBkZW1hbmQgYW5kIHVuZGVyLWVzdGltYXRpbmcgbGV2ZWxzIG9mIHNlcnZpY2UgaW4gdGhlIGVzdGltYXRpb24gb2YgYWNjZXNzaWJpbGl0aWVzIGR1ZSB0byB0aGUgbXVsdGlwbGUtY291bnRpbmcgb2YgcG9wdWxhdGlvbnMgdGhhdCBhcmlzZXMgZnJvbSB0aGUgb3ZlcmxhcHBpbmcgY2F0Y2htZW50cyBpbiBhIHN0dWR5IGFyZWEuIEluIHJlc3BvbnNlLCByZXNlYXJjaGVycyBoYXZlIHByb3Bvc2VkIHNvbHV0aW9ucyBzdWNoIGFzIHRoZSBUaHJlZS1zdGVwIEZsb2F0aW5nIENhdGNobWVudCBBcmVhICgzU0ZDQSkgW0B3YW4yMDEyXSwgTW9kaWZpZWQgMlNGQ0EgKE0yU0ZDQSkgW0BkZWxhbWF0ZXIyMDEzXSwgYW5kIEJhbGFuY2VkIDJTRkNBIChCMlNGQ0EpIFtAcGFlejIwMTldIG1ldGhvZHMuIE9mIHRoZXNlLCB0aGUgQjJTRkNBIGlzIHRoZSBvbmx5IGFwcHJvYWNoIHRoYXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBwb3B1bGF0aW9uIGFuZCByZXN1bHRpbmcgbGV2ZWxzIG9mIHNlcnZpY2UgaW4gY2FsY3VsYXRpbmcgZmxvYXRpbmcgY2F0Y2htZW50IGFjY2Vzc2liaWxpdGllcy4KCkhvd2V2ZXIsIGRlc3BpdGUgdGhlc2UgaW5ub3ZhdGlvbnMsIEZDQSBtZXRob2RzIHJlbWFpbiBsaW1pdGVkIGluIHNldmVyYWwgd2F5cy4gRmlyc3QsIEZDQSBhcHByb2FjaGVzIG9mdGVuIGluZmxhdGUgb3IgZGVmbGF0ZSBkZW1hbmQgYW5kIHN1cHBseSBpbiB0aGUgY2FsY3VsYXRpb24gb2YgaGVhbHRoY2FyZSBhY2Nlc3MuIFdoaWxlIHRoZSBCMlNGQ0EgcmVtZWRpZXMgdGhpcywgaXQgZG9lcyBzbyBieSBhc3NpZ25pbmcgZnJhY3Rpb25zIG9mIHBvcHVsYXRpb25zIHRvIGNsaW5pY3MgYW5kIHNlcnZpY2UgcmF0aW9zIHRvIHBvcHVsYXRpb24gem9uZXMuIFdoaWxlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBiYWxhbmNlZCBtZXRob2Qgc3VtIHRvIHRoZSBvcmlnaW5hbCB6b25hbCBwb3B1bGF0aW9ucyBhbmQgcHJvdmlkZXItdG8tcG9wdWxhdGlvbiByYXRpb3MsIHRoaXMgZnJhY3Rpb25hbCBhcHByb2FjaCBkb2VzIG5vdCByZWZsZWN0IHRoZSB3YXlzIGluIHdoaWNoIGluZGl2aWR1YWxzIGNob29zZSB0byB2aXNpdCBmYWNpbGl0aWVzLiBTZWNvbmQsIHRoZSBhcHBlYWwgb2YgYW55IGdpdmVuIGhlYWx0aGNhcmUgZmFjaWxpdHkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHBvcHVsYXRpb24gaXMgYmFzZWQgc29sZWx5IG9uIGl0cyBkaXN0YW5jZSBvciB0cmF2ZWwgdGltZSBmcm9tIHRoZSBvcmlnaW4gem9uZSB1c2luZyB0aGUgdHJhbnNwb3J0YXRpb24gbmV0d29yay4KCkluIHJlc3BvbnNlLCB0aGlzIHJlc2VhcmNoIHV0aWxpemVzIGEgcmFuZG9tIHV0aWxpdHktYmFzZWQgZm9ybXVsYXRpb24gZm9yIG1vZGVsbGluZyBhY2Nlc3NpYmlsaXR5IHRvIGhlYWx0aGNhcmUgc2VydmljZXMuIEluIGNvbnRyYXN0IHRvIEZDQSBhcHByb2FjaGVzLCBlYWNoIHBhdGllbnQgaXMsIG9uIGF2ZXJhZ2UsIGFzc2lnbmVkIHRvIGEgc2luZ2xlIGNsaW5pYywgYXZvaWRpbmcgdGhlIGlzc3VlIG9mIGRvdWJsZS1jb3VudGluZyBhbmQgaW5mbGF0aW9uL2RlZmxhdGlvbiBvZiB0aGUgZGVtYW5kIGFuZCBsZXZlbHMtb2Ytc2VydmljZSByZXNwZWN0aXZlbHkgaW4gdGhlIDJTRkNBIG1ldGhvZHMgYW5kIHRoZSBhc3NpZ25tZW50IG9mIGZyYWN0aW9uYWwgaW5kaXZpZHVhbHMgdG8gY2xpbmljcyBpbiB0aGUgQjJTRkNBIG1ldGhvZC4gQmV5b25kIHRyYXZlbCB0aW1lLCB0aGlzIHNwZWNpZmljYXRpb24gYWxzbyBhbGxvd3MgdGhlIGFuYWx5c3QgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZmFjaWxpdGllcyB0aGF0IGFmZmVjdCB0aGVpciBhcHBlYWwsIHN1Y2ggYXMgQ09OR0VTVElPTi4gVG8gaWxsdXN0cmF0ZSB0aGUgcG90ZW50aWFsIG9mIHRoZSBNTkwgYXBwcm9hY2gsIHdlIGNvbXBhcmUgaXQgYWdhaW5zdCB0aGUgdXNlIG9mIHRoZSAyU0ZDQSBhbmQgQjJTRkNBLCBib3RoIHVzaW5nIGEgY29udGludW91cyBkZWNheSBmdW5jdGlvbi4KCiMgTWV0aG9kb2xvZ3kKIyMgRmxvYXRpbmcgQ2F0Y2htZW50IE1ldGhvZHMKClRoZSAyLXN0ZXAgZmxvYXRpbmcgY2F0Y2htZW50IGFyZWEgKDJTRkNBKSBtZXRob2QsIGRldmVsb3BlZCBieSBMdW8gYW5kIFdhbmcsIGNhbGN1bGF0ZXMgYWNjZXNzaWJpbGl0eSB0byBoZWFsdGhjYXJlIHVzaW5nIGNhdGNobWVudCBhcmVhcyBiYXNlZCBvbiBhIHRyYXZlbCB0aW1lIHRocmVzaG9sZCBbQGx1bzIwMDNdLiBUaGUgZmlyc3Qgc3RlcCBvZiB0aGlzIG1ldGhvZCBpcyBjYWxjdWxhdGluZyB0aGUgcGh5c2ljaWFuLXRvLXBvcHVsYXRpb24gcmF0aW8sICRSX2okLCBmb3IgZWFjaCBjbGluaWMgYXQgbG9jYXRpb24gJGokOgoKJCQKUl9qID0gXGZyYWN7U19qfXtcc3VtX2l7UF9pV197aWp9fX0KJCQKCldoZXJlICRTX2okIGlzIHRoZSBudW1iZXIgb2YgcGh5c2ljaWFucyBhdCBjbGluaWMgJGokIGFuZCAkUF9pJCBpcyB0aGUgcG9wdWxhdGlvbiBvZiB6b25lICRpJCB3ZWlnaHRlZCBieSBzb21lIGZ1bmN0aW9uIG9mIHRoZSB0cmF2ZWwgdGltZSAkV197aWp9JCBiZXR3ZWVuIHpvbmVzICRpJCBhbmQgJGokLiBJbiB0aGUgb3JpZ2luYWwgMlNGQ0EsIEx1byBhbmQgV2FuZyBbLUBsdW8yMDAzXSB1dGlsaXplIGEgYmluYXJ5IGltcGVkYW5jZSBmdW5jdGlvbjoKCiQkCldfe2lqfSA9IGYodF97aWp9KSA9IFxsZWZ0XHsKICAgICAgICBcYmVnaW57YXJyYXl9e2xsfQogICAgICAgICAgICAxICYgXHF1YWQgdF97aWp9IFxsZXEgdF8wIFxcCiAgICAgICAgICAgIDAgJiBccXVhZCB0X3tpan0gPiB0XzAKICAgICAgICBcZW5ke2FycmF5fQogICAgXHJpZ2h0LgokJAoKd2hlcmUgdGhlIHdlaWdodCBlcXVhbHMgMSBmb3IgcG9wdWxhdGlvbnMgd2l0aGluIHRoZSB0cmF2ZWwgdGltZSB0aHJlc2hvbGQgJHRfMCQgYW5kIHplcm8gYmV5b25kLiBJbiB0aGlzIGNhc2UsIEx1byBhbmQgV2FuZyBbLUBsdW8yMDAzXSBzZXQgJHRfMCA9IDE1JCBtaW51dGVzLiBUaGUgc2Vjb25kIHN0ZXAgY2FsY3VsYXRlcyBhY2Nlc3NpYmlsaXR5ICRBX2kkIGZvciB0aGUgcG9wdWxhdGlvbiBjZW50cmVzIGFzIHRoZSBzdW0gb2YgdGhlIHBoeXNpY2lhbi10by1wb3B1bGF0aW9uIHJhdGlvcyAkUl9qJCB3ZWlnaHRlZCBieSB0aGUgaW1wZWRhbmNlIGZ1bmN0aW9uOgoKJCQKQV9pID0gXHN1bV9qe1Jfaldfe2lqfX0KJCQKCldoaWxlIHRoZSAyU0ZDQSBhcHByb2FjaCBpcyBhIHNwZWNpYWwgY2FzZSBvZiBhIGdyYXZpdHktYmFzZWQgYWNjZXNzaWJpbGl0eSBtZWFzdXJlLCB0aGUgYmluYXJ5IGltcGVkYW5jZSBmdW5jdGlvbiB1c2VkIGJ5IEx1byBhbmQgV2FuZyBbLUBsdW8yMDAzXSBkb2VzIG5vdCBjb25zaWRlciB0aGUgZWZmZWN0cyBvZiBjb21wZXRpdGlvbiBhbmQgdHJhdmVsIGltcGVkYW5jZSB3aXRoaW4gYSBnaXZlbiBjYXRjaG1lbnQgYXJlYS4gQWxsIGNsaW5pY3Mgd2l0aGluIGEgcG9wdWxhdGlvbiBjZW50cmUncyBjYXRjaG1lbnQgYXJlYSBhcmUgY29uc2lkZXJlZCBlcXVhbGx5IGFjY2Vzc2libGUsIHJlZ2FyZGxlc3Mgb2YgZGlzdGFuY2UsIHNpemUsIHdhaXQgdGltZXMsIG9yIGFueSBvdGhlciBtZWFzdXJlcyBvZiBhdHRyYWN0aXZlbmVzcy4gTW9yZW92ZXIsIGFsbCBjbGluaWNzIG91dHNpZGUgb2YgYSBwb3B1bGF0aW9uIGNlbnRyZSdzIGNhdGNobWVudCBhcmVhIGFyZSBjb25zaWRlcmVkIGNvbXBsZXRlbHkgaW5hY2Nlc3NpYmxlLiBUbyByZW1lZHkgdGhpcywgTHVvIGFuZCBRaSBbLUBsdW8yMDA5XSBwcm9wb3NlIHRoZSBFbmhhbmNlZCAyLXN0ZXAgRmxvYXRpbmcgQ2F0Y2htZW50IEFyZWEgKEUyU0ZDQSkgbWV0aG9kIHRoYXQgaW50cm9kdWNlcyBjYXRlZ29yaWNhbCB3ZWlnaHRzIGZvciBkaWZmZXJlbnQgdHJhdmVsIHRpbWUgdGhyZXNob2xkcyB0byBhY2NvdW50IGZvciB0cmF2ZWwgaW1wZWRhbmNlLiBPdGhlcnMgaGF2ZSBpbXByb3ZlZCBvbiB0aGUgMlNGQ0EgYW5kIEUyU0ZDQSBieSB1c2luZyB2YXJpYWJsZSBjYXRjaG1lbnQgc2l6ZXMgW0BtY2dyYWlsMjAwOV0sIGNvbnRpbnVvdXMgdHJhdmVsIHRpbWUgZGVjYXkgZnVuY3Rpb25zIFtAZGFpMjAxMF0sIGFuZCBhZGFwdGl2ZSBhcHByb2FjaGVzIFtAYmF1ZXIyMDE2XSB0byBiZXR0ZXIgcmVmbGVjdCB0cmF2ZWwgdGltZSBjb3N0cyBhbmQgdGhlIGdyZWF0ZXIgYXBwZWFsIG9mIG1vcmUgcHJveGltYXRlIG9wcG9ydHVuaXRpZXMuCgpSZXNlYXJjaGVycyBoYXZlIGFsc28gc291Z2h0IHRvIGltcHJvdmUgdGhlIHdheXMgaW4gd2hpY2ggc3VwcGx5IGFuZCBkZW1hbmQgYXJlIG1vZGVsZWQgaW4gZmxvYXRpbmcgY2F0Y2htZW50IGFwcHJvYWNoZXMuIFByZXZpb3VzIHJlc2VhcmNoIGhhcyBzaG93biB0aGF0IGJvdGggZGVtYW5kIGFuZCBzdXBwbHkgY2FuIGJlIGluZmxhdGVkL2RlZmxhdGVkIGluIEZDQSBtZXRob2RzIFtAZGVsYW1hdGVyMjAxMzsgQHBhZXoyMDE5OyBAd2FuMjAxMl0uIFRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgb3ZlcmxhcHBpbmcgZmxvYXRpbmcgY2F0Y2htZW50cyB0aGF0IGNhdXNlIHRoZSBwb3B1bGF0aW9ucyBpbiB6b25lcyAkaSQgdG8gYmUgY291bnRlZCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHByb3ZpZGVyLXRvLXBvcHVsYXRpb24gcmF0aW8gJFJfaiQuIFRoZXNlIGxldmVscy1vZi1zZXJ2aWNlIGFyZSwgaW4gdHVybiwgY291bnRlZCBtdWx0aXBsZSB0aW1lcyB3aGVuIGFsbG9jYXRlZCBiYWNrIHRvIHRoZSBwb3B1bGF0aW9uIHpvbmVzIGluIHRoZSBjYWxjdWxhdGlvbiBvZiAkQV9pJC4gSW4gcmVzcG9uc2UsIFdhbiBldCBhbC4gcHJvcG9zZSB0aGUgdXNlIG9mIGFkZGl0aW9uYWwgR2F1c3NpYW4gd2VpZ2h0cyB0byBtb2RpZnkgdGhlIGJpbmFyeSBpbXBlZGFuY2UgZnVuY3Rpb24gdXNlZCBieSBMdW8gYW5kIFdhbmcgWy1AbHVvMjAwM10uIERlbGFtYXRlcidzIFstQGRlbGFtYXRlcjIwMTNdIE0yU0ZDQSBtb2RpZmllcyB0aGUgc2Vjb25kIHN0ZXAgb2YgdGhlIDJTRkNBIGFwcHJvYWNoIGJ5IHNxdWFyaW5nIHRoZSBpbXBlZGFuY2UgZnVuY3Rpb24gdG8gaW5jcmVhc2UgdGhlIHJhdGUgb2YgZGVjYXkgb24gdGhlIGxldmVsIG9mIHNlcnZpY2UuIFRoaXMgaXMgZG9uZSB0byByZWZsZWN0IHRoZSBpbmNyZWFzZWQgZnJpY3Rpb24gcG9wdWxhdGlvbiBjZW50cmVzIG1heSBleHBlcmllbmNlIHdoZW4gYWNjZXNzaW5nIGhlYWx0aGNhcmUgZmFjaWxpdGllcyBpbiBzdWItb3B0aW1hbGx5IGNvbmZpZ3VyZWQgdXJiYW4gc3lzdGVtcy4KCkhvd2V2ZXIsIG5laXRoZXIgb2YgdGhlc2UgYXBwcm9hY2hlcyBmdWxseSByZXNvbHZlcyB0aGUgaXNzdWUgb2YgZGVtYW5kIGFuZCBzdXBwbHkgaW5mbGF0aW9uL2RlZmxhdGlvbi4gVG8gdGhhdCBlbmQsIHRoZSBCMlNGQ0EgYXBwcm9hY2ggZnJvbSBQw6FleiBldCBhbC4gWy1AcGFlejIwMTldIHRoYXQgcmVwbGFjZXMgdGhlIGltcGVkYW5jZSBmdW5jdGlvbnMgd2l0aCByb3ctc3RhbmRhcmRpemVkIHdlaWdodHMgJFdfe2lqfV57aX0kIGluIHRoZSBmaXJzdCBzdGVwOgoKJCQKUl9qID0gXGZyYWN7U19qfXtcc3VtX2l7UF9pV197aWp9XntpfX19CiQkCiQkCldfe2lqfV57aX0gPSBcZnJhY3tXX3tpan19e1xzdW1faiBXX3tpan19CiQkCgphbmQgd2l0aCBjb2x1bW4tc3RhbmRhcmRpemVkIHdlaWdodHMgJFdfe2lqfV57an0kIGluIHRoZSBzZWNvbmQgc3RlcDoKCiQkCkFfaSA9IFxzdW1fantSX2pXX3tpan1ee2p9fQokJAokJApXX3tpan1ee2p9ID0gXGZyYWN7V197aWp9fXtcc3VtX2kgV197aWp9fQokJAoKSW4gdGhpcyBmb3JtdWxhdGlvbiwgdGhlIHRyYXZlbC10aW1lIHdlaWdodGVkIHBvcHVsYXRpb25zIHN1bSB0byB0aGUgb3JpZ2luYWwgcG9wdWxhdGlvbiB2YWx1ZXMgYW5kIGRvIG5vdCBkZWZsYXRlIHRoZSBsZXZlbC1vZi1zZXJ2aWNlIGF0IHRoZSBjbGluaWNzLiBCeSBleHRlbnNpb24sIHRoZSBsZXZlbHMgb2Ygc2VydmljZSBhdmFpbGFibGUgYXQgdGhlIHBvcHVsYXRpb24gY2VudHJlcyBhcmUgbm90IGluZmxhdGVkIHRocm91Z2ggbXVsdGlwbGUgY291bnRpbmcuIEZvciB0aGlzIHJlc2VhcmNoLCB3ZSBlbXBsb3kgYm90aCB0aGUgMlNGQ0EgYW5kIEIyU0ZDQSBhcHByb2FjaGVzIHdpdGggYSBuZWdhdGl2ZSBleHBvbmVudGlhbCBpbXBlZGFuY2UgZnVuY3Rpb246CgokJApXX3tpan0gPSBlXnstXGJldGEgdF97aWp9fQokJAoKd2hlcmUgJFxiZXRhJCBpcyBhIHBhcmFtZXRlciB0aGF0IGRldGVybWluZXMgdGhlIGRlY2F5IG9mIHRoZSBmdW5jdGlvbiBhbmQgJHRfe2lqfSQgaXMgdGhlIHRyYXZlbCB0aW1lIGJldHdlZW4gY2xpbmljICRqJCBhbmQgcG9wdWxhdGlvbiBjZW50cmUgJGkkLiBUaGUgJFxiZXRhJCBwYXJhbWV0ZXIgaXMgc2V0IHRvIDAuMDUgYXMgdGhpcyBpcyBpbiB0aGUgcmFuZ2Ugb2YgdHlwaWNhbCBhdXRvIHRyYXZlbCB0aW1lIHBhcmFtZXRlcnMgaW4gbG9naXQgbW9kZSBjaG9pY2UgbW9kZWxzIGNhbGlicmF0ZWQgaW4gdGhlIEdyZWF0ZXIgVG9yb250byBhbmQgSGFtaWx0b24gQXJlYS4KCiMjIFV0aWxpdHktYmFzZWQgTWV0aG9kCgpEZXNwaXRlIG9mZmVyaW5nIGJhbGFuY2UgYWNyb3NzIGJvdGggc3RhZ2VzIG9mIHRoZSBGQ0EgYXBwcm9hY2gsIHRoZSBCMlNGQ0EgcmVzdWx0cyBpbiBmcmFjdGlvbmFsIGFwcG9ydGlvbm1lbnQgb2YgdGhlIHBvcHVsYXRpb24gYW5kIGxldmVscy1vZi1zZXJ2aWNlIGJldHdlZW4gdGhlIHBvcHVsYXRpb24gem9uZXMgYW5kIGNsaW5pY3MuIFRvIGFkZHJlc3MgdGhlIGxpbWl0YXRpb25zIG9mIGV4aXN0aW5nIG1ldGhvZHMsIGEgbm92ZWwgbWV0aG9kb2xvZ3kgaXMgZGV2ZWxvcGVkIHdoaWNoIGFzc2lnbnMgdHJpcHMgZnJvbSBwb3B1bGF0aW9uIGNlbnRyZXMgdG8gY2xpbmljcy4gVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFzIGZvbGxvd3M6CgokJApUX3tpan0gPSBmKEhfaSwgWl9qLCBSX2osIHRfe2lqfSwgXGJldGEpCiQkCgp3aGVyZToKCi0gICAkVF97aWp9JCBpcyB0aGUgbnVtYmVyIG9mIHRyaXBzIGZyb20gem9uZSAkaSQgdG8gY2xpbmljICRqJAotICAgJEhfaSQgaXMgdGhlIG51bWJlciBvZiBob3VzZWhvbGRzIGluIHpvbmUgJGkkCi0gICAkWl9qJCBpcyB0aGUgbnVtYmVyIG9mIGRvY3RvcnMgYXQgY2xpbmljICRqJAotICAgJFJfaiQgaXMgdGhlIGRlbWFuZC10by1jYXBhY2l0eSByYXRpbyBhdCBjbGluaWMgJGokIChub3RlIHRoaXMgaXMgaW52ZXJ0ZWQgZnJvbSB0aGUgcGh5c2ljaWFuLXRvLXBvcHVsYXRpb24gcmF0aW9zIHVzZWQgaW4gcHJldmlvdXMgRkNBIGFwcHJvYWNoZXMpCi0gICAkdF97aWp9JCBpcyB0aGUgdHJhdmVsIHRpbWUgYmV0d2VlbiB6b25lcyAkaSQgYW5kICRqJCwgYW5kICRcYmV0YSQgaXMgYSByb3cgdmVjdG9yIG9mIHBhcmFtZXRlcnMgdG8gYmUgZXN0aW1hdGVkLgoKVG8gZXN0aW1hdGUgdGhlc2UgcGFyYW1ldGVycywgaW5mb3JtYXRpb24gbWluaW1pemF0aW9uIGlzIHVzZWQgYXMgdGhpcyBhcHByb2FjaCBhbGxvd3MgZm9yIHRoZSBsZWFzdC1iaWFzZWQgcGFyYW1ldGVyIGVzdGltYXRpb24gYW5kIGhhcyBiZWVuIHByb3ZlbiB0byBiZSBpZGVudGljYWwgdG8gdXRpbGl0eSBtYXhpbWl6YXRpb24gW0BhbmFzMTk4M10uIEJhc2VkIG9uIGluZm9ybWF0aW9uIG1pbmltaXphdGlvbiB0aGVvcnksIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgaG91c2Vob2xkIGluIHpvbmUgaSB3aWxsIHZpc2l0IGNsaW5pYyBqIGNhbiBiZSBlc3RpbWF0ZWQgYXMgZm9sbG93czoKCiQkCk1BWF97VF97aWp9fSBFID0gLVxzdW1fe2ogXGluIEp9IFxzdW1fe2kgXGluIEl9IFRfe2lqfSBsb2coVF97aWp9KQokJAoKU3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzOgoKJCQKXHN1bV97aiBcaW4gSn1UX3tpan0gPSBcYWxwaGEgSF9pIFxmb3JhbGwgaSBcaW4gSSAKJCQKJCQKXHN1bV97aSBcaW4gSX0gXHN1bV97aiBcaW4gSn0gVF97aWp9IHRfe2lqfSA9IFxiYXJ7dH1UIAokJAokJApcc3VtX3tpIFxpbiBJfSBcc3VtX3tqIFxpbiBKfSBUX3tpan0gbG9nKENfaikgPSBcc3VtX3tpIFxpbiBJfSBcc3VtX3tqIFxpbiBKfVRfe2lqfSBsb2cgXG9tZWdhIFpfaiA9IFxiYXJ7Q31UIAokJAokJApcc3VtX3tpIFxpbiBJfSBcc3VtX3tqIFxpbiBKfSBUX3tpan0gUl9qID0gXGJhcntSfVQKJCQKCndoZXJlOgoKLSAgICRJJCBpcyB0aGUgc2V0IG9mIGFsbCByZXNpZGVudGlhbCB6b25lcwotICAgJEokIGlzIHRoZSBzZXQgb2YgYWxsIGNsaW5pY3MKLSAgICRcYWxwaGEkIGlzIHRoZSBhdmVyYWdlIG51bWJlciBvZiB2aXNpdHMgdG8gdGhlIGRvY3RvciBwZXIgaG91c2Vob2xkCi0gICAkXGJhcnt0fSQgaXMgdGhlIGF2ZXJhZ2Ugb2JzZXJ2ZWQgdHJhdmVsIHRpbWUgZm9yIGhvbWUtYmFzZWQgdHJpcHMgdG8gY2xpbmljcwotICAgJFQkIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZGFpbHkgdHJpcHMgdG8gY2xpbmljcwotICAgJENfaiQgaXMgdGhlIG5vbWluYWwgc2VydmljZSBjYXBhY2l0eSBhdCBjbGluaWMgJGokCi0gICAkXG9tZWdhJCBpcyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgcGF0aWVudHMgc2VydmVkIGJ5IGEgZG9jdG9yIHBlciBkYXkKLSAgICRcYmFye0N9JCBpcyB0aGUgYXZlcmFnZSBvYnNlcnZlZCBub21pbmFsIHNlcnZpY2UgY2FwYWNpdHkKLSAgICRcYmFye1J9JCBpcyB0aGUgYXZlcmFnZSBvYnNlcnZlZCBkZW1hbmQtdG8tY2FwYWNpdHkgcmF0aW8KLSAgICRIJCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGhvdXNlaG9sZHMKLSAgICRaJCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHByaW1hcnkgY2FyZSBwaHlzaWNpYW5zCgpUaGUgc2VydmljZSBjYXBhY2l0aWVzIGFuZCBkZW1hbmQtdG8tY2FwYWNpdHkgcmF0aW9zIGFyZSBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6CgokJApDX2ogPSBcb21lZ2EgWl9qCiQkCiQkClJfaiA9IFxmcmFje1xzdW1fe2kgXGluIEl9IFRfe2lqfX17Q19qfSA9IFxmcmFje1xzdW1fe2kgXGluIEl9IFRfe2lqfX17XG9tZWdhIFpfan0KJCQKClNvbHZpbmcgdGhpcyBzZXQgb2YgZXF1YXRpb25zIHlpZWxkcyB0aGUgZm9sbG93aW5nOgoKJCQKVF97aWp9ID0gXGFscGhhIEhfaSBQX3tpan0KJCQKClRoaXMgaXMgYSBzaW5nbHktY29uc3RyYWluZWQgZ3Jhdml0eSBtb2RlbCB3aGVyZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIGhvdXNlaG9sZCBpbiB6b25lICRpJCB3aWxsIHZpc2l0IGNsaW5pYyAkaiQgaXMgYXMgZm9sbG93czoKCiQkClBfe2lqfSA9IFxmcmFje2Vee1xiZXRhXzEgdF97aWp9ICsgXGJldGFfe0srMn0gbG9nIFxvbWVnYSBaX2ogKyBcYmV0YV97SyArIDN9IFJfan19e1xzdW1falxwcmltZSBlXntcYmV0YV8xIHRfe2lqfVxwcmltZSArIFxiZXRhX3tLKzJ9IGxvZyBcb21lZ2EgWl9qXHByaW1lICsgXGJldGFfe0sgKyAzfSBSX2pccHJpbWV9fQokJAoKSWRlYWxseSwgdGhlICRcYmV0YV8xJCwgJFxiZXRhX3tLKzJ9JCwgYW5kICRcYmV0YV97SyArIDN9JCBwYXJhbWV0ZXJzIHdvdWxkIGJlIGVzdGltYXRlZCBpdGVyYXRpdmVseSBpbiBvcmRlciB0byBtZWV0IHRoZSBvdXRsaW5lZCBjb25zdHJhaW50cy4gSG93ZXZlciwgZHVlIHRvIGEgbGFjayBvZiBvYnNlcnZlZCBkYXRhIG9uIHRyaXBzIHRvIGRvY3RvcnMsIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGluc3RlYWQgY2hvc2VuIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29uc2lkZXJhdGlvbnM6CgotICAgVGhlICRcYmV0YV8xJCB0cmF2ZWwgdGltZSBpbXBlZGFuY2UgcGFyYW1ldGVyIGlzIHNldCB0byAtMC4wNSBiYXNlZCBvbiBwcmV2aW91cyBjaG9pY2UgbW9kZWxzIGluIHRoZSByZWdpb24gYW5kIHRvIGFsaWduIHdpdGggdGhlIDJTRkNBIGFuZCBCMlNGQ0EgYXBwcm9hY2hlcyBhYm92ZQoKLSAgIFJhbmRvbSB1dGlsaXR5IHRoZW9yeSByZXF1aXJlcyAkXGJldGFfe0srMn0kIHRvIGxpZSBiZXR3ZWVuIDAgdG8gMSBpbiB2YWx1ZS4gSXQgaXMgc2V0IGVxdWFsIHRvIDEgaW4gdGhpcyBjYXNlIHRvIG1heGltaXplIHRoZSBhdHRyYWN0aXZlbmVzcyBvZiBsYXJnZXIgY2xpbmljcy4KCi0gICBObyB0aGVvcnkgaXMgY3VycmVudGx5IGF2YWlsYWJsZSB0byBndWlkZSB0aGUgY2hvaWNlIG9mIHRoZSAkXGJldGFfe0srM30kIHBhcmFtZXRlciBhbmQgc28gLTAuNSBpcyBjaG9zZW4gYXMgYSAiZmlyc3QgZ3Vlc3MiIGF0IGEgcGFyYW1ldGVyIHZhbHVlIHRoYXQgd291bGQgcHJvZHVjZSBhIHJlYXNvbmFibGUgc2Vuc2l0aXZpdHkgdG8gY2xpbmljIG92ZXItY3Jvd2RpbmcsIGJ1dCBub3QgcHJldmVudCBvdmVyLWNyb3dkaW5nIGZyb20gb2NjdXJyaW5nCgpUaGVzZSB2YWx1ZXMgZW5zdXJlIHRoYXQgaW5jcmVhc2VkIHRyYXZlbCB0aW1lcyBhbmQgZGVtYW5kLXRvLWNhcGFjaXR5IHJhdGlvcyByZWR1Y2UgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBob3VzZWhvbGQgaW4gem9uZSAkaSQgd2lsbCB2aXNpdCBjbGluaWMgJGokLCBhbmQgaW5jcmVhc2VkIGNhcGFjaXR5IGF0IGNsaW5pYyAkaiQgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eS4gCgpJbiBvcmRlciB0byBlbnN1cmUgdGhhdCAkXGJhcntSfSQgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byAxLCB0aGUgJFxhbHBoYSQgYW5kICRcb21lZ2EkIHBhcmFtZXRlcnMgYXJlIGFzc3VtZWQgdG8gYmUgMC4wNjUgdmlzaXRzIHRvIHRoZSBkb2N0b3IgcGVyIGhvdXNlaG9sZCBhbmQgMjIgcGF0aWVudHMgc2VlbiBieSBhIGRvY3RvciBwZXIgZGF5LCBvbiBhdmVyYWdlLCByZXNwZWN0aXZlbHkuIFNpbmNlICRSX2okIGlzIGEgZnVuY3Rpb24gb2YgJFRfe2lqfSQgYW5kIHZpY2UtdmVyc2EsIGFuIGl0ZXJhdGl2ZSBhcHByb2FjaCBpcyB0YWtlbiB0byBlc3RpbWF0ZSB0aGUgJFJfaiQgdmFsdWVzLiBUaGUgbXVsdG9ub21pYWwgbG9naXQgZGVzdGluYXRpb24gY2hvaWNlIG1vZGVsIGVuc3VyZXMgdGhhdCBkZW1hbmQgYXQgY2xpbmljcyBpcyBub3Qgb3Zlci1lc3RpbWF0ZWQsIGFzIGVhY2ggcGF0aWVudCBvbiBhdmVyYWdlIGlzIGFzc2lnbmVkIHRvIGEgc2luZ2xlIGNsaW5pYyBhbmQgaXMgbm90IGRvdWJsZSBjb3VudGVkLCBhcyBvY2N1cnMgaW4gdGhlIDJTRkNBIG1ldGhvZC4gVGhlIGVuZCByZXN1bHQgaXMgYW4gYXBwcm9hY2ggdGhhdCBpbnZvbHZlcyBsb2NhdGlvbiBjaG9pY2UgbW9kZWxsaW5nIGJ5IG1heGltaXppbmcgdXRpbGl0eSBmb3IgcGF0aWVudHMsIHdpdGggY2xpbmljcyB3aXRoIGhpZ2hlciBkZW1hbmQgYW5kIGxvbmdlciB0cmF2ZWwgdGltZXMgYXR0cmFjdGluZyBmZXdlciB0cmlwcyB3aGlsZSBsYXJnZXIgY2xpbmljcyBhbmQgdGhvc2UgY2xvc2VyIHRvIHRoZSBvcmlnaW5zIGF0dHJhY3QgbW9yZSB0cmlwcy4gCgojIyBVdGlsaXR5LWJhc2VkIEFjY2Vzc2liaWxpdHkKCkFzIHNob3duIGJ5IEFuYXMgWy1AYW5hczE5ODNdLCBtdWx0aW5vbWlhbCBsb2dpdCBtb2RlbHMgYXJlIGVxdWl2YWxlbnQgdG8gZ3Jhdml0eSBtb2RlbHMuIEZvbGxvd2luZyBCZW4tQWtpdmEgYW5kIExlcm1hbiAoQmVuLUFraXZhICYgTGVybWFuLCAxOTg1KSwgYWNjZXNzaWJpbGl0eSBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gcmFuZG9tIHV0aWxpdHkgdGhlb3J5IGFzIHRoZSBleHBlY3RlZCBtYXhpbXVtIHV0aWxpdHkgZm9yIGEgdHJpcC4gRm9yIHRoZSBtdWx0aW5vbWlhbCBsb2dpdCBtb2RlbCwgaXQgY2FuIGJlIHNob3duIHRoYXQgdGhpcyBpcyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBsb2dpdCBtb2RlbCAodGhlIHNvLWNhbGxlZCAibG9nc3VtIiBvciAiaW5jbHVzaXZlIHZhbHVlIiB0ZXJtKSwgeWllbGRpbmcgZm9yIHRoaXMgbW9kZWwgdGhlIGZvbGxvd2luZyBhY2Nlc3NpYmlsaXR5IG1lYXN1cmU6CgokJAphX2kgPSBsb2coXHN1bV97alxwcmltZX0gZV57XGJldGFfMSB0X3tpan1ccHJpbWUgKyBcYmV0YV97SysyfSBsb2cgXG9tZWdhIFpfalxwcmltZSArIFxiZXRhX3tLICsgM30gUl9qXHByaW1lfSkKJCQKCiMgU3R1ZHkgQXJlYQoKVGhlIHN0dWR5IGFyZWEgZm9yIHRoaXMgcmVzZWFyY2ggaXMgdGhlIENpdHkgb2YgSGFtaWx0b24gaW4gT250YXJpbywgQ2FuYWRhLiBCYXNlZCBvbiBkYXRhIGZyb20gdGhlIDIwMTYgQ2FuYWRpYW4gQ2Vuc3VzIG9mIFBvcHVsYXRpb24sIHRoZSBwb3B1bGF0aW9uIG9mIEhhbWlsdG9uIGlzIGByIHByZXR0eU51bShkYXRhX2RhXzIwMTZfcG9seSAlPiUgc3RfZHJvcF9nZW9tZXRyeSgpICU+JSBzdW1tYXJpemUoc3VtKFBvcHVsYXRpb24pKSAlPiUgcHVsbCgpLCBiaWcubWFyayA9ICIsIilgIGxpdmluZyBpbiBgciBwcmV0dHlOdW0oZGF0YV9kYV8yMDE2X3BvbHkgJT4lIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUgc3VtbWFyaXplKHN1bShIb3VzZWhvbGRzKSkgJT4lIHB1bGwoKSwgYmlnLm1hcmsgPSAiLCIpYCBob3VzZWhvbGRzLiBCYXNlZCBvbiB0aGUgYXNzdW1lZCAkXG9tZWdhID0gMC4wNjUkIHZpc2l0cyB0byB0aGUgZG9jdG9yIHBlciBob3VzZWhvbGQsIHRoaXMgcmVzdWx0cyBpbiBgciBwcmV0dHlOdW0oZGF0YV9kYV8yMDE2X3BvbHkgJT4lIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUgc3VtbWFyaXplKHN1bShIb3VzZWhvbGRzKSowLjA2NSkgJT4lIHB1bGwoKSwgYmlnLm1hcmsgPSAiLCIpYCB0cmlwcyB0byB0aGUgZG9jdG9yIGVudGVyaW5nIHRoZSBNTkwgbW9kZWwuIFRoZSBsZWZ0IHBhbmVsIG9mIEZpZ3VyZSBccmVme2ZpZzpzdHVkeV9hcmVhX21hcH0gcGxvdHMgcG9wdWxhdGlvbiBkZW5zaXRpZXMgaW4gdGhlIERpc3NlbWluYXRpb24gQXJlYSBjZW5zdXMgc21hbGwgZ2VvZ3JhcGhpYyB1bml0cyBpbiB0aGUgQ2l0eSBvZiBIYW1pbHRvbiwgaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIGhpZ2hlci1kZW5zaXR5IHVyYmFuIGNvcmUgaXMgc3Vycm91bmRlZCBieSBsb3dlci1kZW5zaXR5IHN1YnVyYnMgdGhhdCBleHRlbmQgaW50byBsYW5kIHRoYXQgaXMgbGFyZ2VseSBydXJhbCBpbiBjaGFyYWN0ZXIuCgpJbmZvcm1hdGlvbiBvbiB0aGUgY291bnQgYW5kIGxvY2F0aW9uIG9mIHByaW1hcnkgY2FyZSBwaHlzaWNpYW5zIHdhcyBvYnRhaW5lZCB1c2luZyB0aGUgQ29sbGVnZSBvZiBQaHlzaWNpYW5zIGFuZCBTdXJnZW9ucyBvZiBPbnRhcmlvJ3Mgb25saW5lIHJlZ2lzdHJhdGlvbiBkYXRhYmFzZS4gQ2xpbmljIGxvY2F0aW9ucyB3ZXJlIGdlb2NvZGVkIGJhc2VkIG9uIHRoZWlyIGFkZHJlc3MgYW5kIHJlY29yZHMgd2VyZSBhZ2dyZWdhdGVkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcGh5c2ljaWFucyBwcmFjdGljaW5nIGF0IGVhY2ggdW5pcXVlIGxvY2F0aW9uLiBUaGUgZGF0YSBmb3IgdGhpcyBwYXBlciBoYXZlIGJlZW4gdXNlZCBwcmV2aW91c2x5IGluIHRoZSBwYXBlciBieSBQw6FleiBldCBhbC4gWy1AcGFlejIwMTldLCBhbHRob3VnaCBpbiB0aGlzIGNhc2Ugd2UgY29uc2lkZXIgb25seSBjbGluaWNzIHRoYXQgYXJlIHdpdGhpbiB0aGUgc3BhdGlhbCBleHRlbnQgb2YgdGhlIENpdHkgb2YgSGFtaWx0b24uIFdoaWxlIHRoaXMgZG9lcyBpbnRyb2R1Y2UgZWRnZSBlZmZlY3RzIGluIHRoZSBjYWxjdWxhdGlvbiBvZiBhY2Nlc3NpYmlsaXR5LCBsaW1pdGluZyB0aGUgc3R1ZHkgZXh0ZW50IHRvIGEgY2xvc2VkIHN5c3RlbSBwZXJtaXRzIGNhbGN1bGF0aW9uIG9mIHRoZSBtdWx0aW5vbWlhbCBsb2dpdCBtb2RlbCdzIGNvbmdlc3Rpb24gZWZmZWN0cyBhbmQgdXRpbGl0eS1iYXNlZCBhY2Nlc3NpYmlsaXRpZXMuIEluIHRvdGFsLCB0aGVyZSBhcmUgYHIgcHJldHR5TnVtKGRvY3RvcnMgJT4lIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUgc3VtbWFyaXplKHN1bShkb2N0b3JfY291bnQpKSAlPiUgcHVsbCgpLCBiaWcubWFyayA9ICIsIilgIHByaW1hcnkgY2FyZSBwaHlzaWNpYW5zIGF2YWlsYWJsZSBhdCBjbGluaWNzIGluIHRoZSBDaXR5IG9mIEhhbWlsdG9uIGluIG91ciBkYXRhLiBOb3RlIHRoYXQgdGhpcyBpcyBub3Qgc3RyaWN0bHkgdGhlIG51bWJlciBvZiBwaHlzaWNpYW5zLCBhcyBzb21lIHBoeXNpY2lhbnMgb2ZmZXIgc2VydmljZXMgYXQgbW9yZSB0aGFuIG9uZSBjbGluaWMuIFJhdGhlciwgaXQgcmVmbGVjdHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBwaHlzaWNpYW5zIGF0IGdpdmVuIGxvY2F0aW9ucy4gVGhlIHJpZ2h0IHBhbmVsIG9mIEZpZ3VyZSBccmVme2ZpZzpzdHVkeV9hcmVhX21hcH0gcGxvdHMgdGhlIGxvY2F0aW9uIGFuZCB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHBoeXNpY2lhbnMgYXQgdGhlIGNsaW5pYyBsb2NhdGlvbnMuIFRoaXMgdG90YWwgcHJvZHVjZXMgYSBjaXR5LXdpZGUgYXZlcmFnZSBwcm92aWRlci10by1wb3B1bGF0aW9uIHJhdGlvIG9mIGByIHJvdW5kKChkb2N0b3JzICU+JSBzdF9kcm9wX2dlb21ldHJ5KCkgJT4lIHN1bW1hcml6ZShzdW0oZG9jdG9yX2NvdW50KSkgJT4lIHB1bGwoKSkvKGRhdGFfZGFfMjAxNl9wb2x5ICU+JSBzdF9kcm9wX2dlb21ldHJ5KCkgJT4lIHN1bW1hcml6ZShzdW0oUG9wdWxhdGlvbikvMTAwMDAwKSAlPiUgcHVsbCgpKSwgMilgIHByaW1hcnkgY2FyZSBkb2N0b3JzIGF2YWlsYWJsZSBwZXIgMTAwLDAwMCBwZW9wbGUuIEJhc2VkIG9uIG91ciBhc3N1bXB0aW9uIG9mICRcYWxwaGEgPSAyMiQgcGF0aWVudHMgc2VlbiBwZXIgZG9jdG9yIGV2ZXJ5IGRheSwgdGhpcyByZXN1bHRzIGluIGEgdG90YWwgY2FwYWNpdHkgb2YgYHIgcHJldHR5TnVtKGRvY3RvcnMgJT4lIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUgc3VtbWFyaXplKHN1bShkb2N0b3JfY291bnQpKjIyKSAlPiUgcHVsbCgpLCBiaWcubWFyayA9ICIsIilgIHBhdGllbnQgdmlzaXRzIHBlciBkYXkgaW4gdGhlIE1OTCBtb2RlbCBmb3JtdWxhdGlvbi4KCmBgYHtyIHBsb3Qgc3R1ZHlfYXJlYV9tYXAsIGZpZy5jYXA9IlxcbGFiZWx7ZmlnOnN0dWR5X2FyZWFfbWFwfVBvcHVsYXRpb24gRGVuc2l0eSBhbmQgUGh5c2ljaWFuIExvY2F0aW9ucyIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4vaW1nL3N0dWR5X2FyZWFfbWFwLmpwZyIpCmBgYAoKIyBSZXN1bHRzCiMjIERlbWFuZCBhbmQgQ2xpbmljIExldmVsIG9mIFNlcnZpY2UKClRvIGRpc2N1c3MgdGhlIHJlc3VsdHMsIHdlIGJlZ2luIGJ5IGZvY3VzaW5nIG9uIHRoZSByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aCBob3cgZWFjaCBvZiB0aGUgbWV0aG9kcyBjYWxjdWxhdGVzIGRlbWFuZCBhbmQgbGV2ZWxzIG9mIHNlcnZpY2UgYXQgdGhlIGNsaW5pYyBsb2NhdGlvbnMuIFRoZSBsZXZlbCBvZiBzZXJ2aWNlIGZvciB0aGUgRkNBIGFwcHJvYWNoZXMgaXMgdGhlIGxvY2FsIHByb3ZpZGVyLXRvLXBvcHVsYXRpb24gcmF0aW8gZm9yIGVhY2ggY2xpbmljIHdoaWxlIHRoZSBNTkwgbW9kZWwgY2FsY3VsYXRlcyB0cmlwIGRlbWFuZC10by1wYXRpZW50IGNhcGFjaXR5IHJhdGlvcy4gVG8gbWFrZSB0aGlzIGNvbXBhcmFibGUsIHdlIGZpcnN0IHRha2UgdGhlIGludmVyc2Ugb2YgdGhlIE1OTCByYXRpb3MgdG8gcmVmbGVjdCBwYXRpZW50IGNhcGFjaXR5LXRvLXRyaXAgZGVtYW5kIHJhdGlvIChDRFIpLiBGaWd1cmUgXHJlZntmaWc6cHByX2Rpc3R9IGRpc3BsYXlzIGEgcGFpciBwbG90IG9mIHRoZSBkZW5zaXR5IG9mIGVhY2ggbGV2ZWwtb2Ytc2VydmljZSBzdGF0aXN0aWMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcCBhbmQgY29ycmVsYXRpb25zIHdpdGggb25lIGFub3RoZXIuIFRoZSBwbG90IGhpZ2hsaWdodHMgaG93IHRoZSAyU0ZDQSBhbmQgQjJTRkNBIG1ldGhvZHMgc2lnbmlmaWNhbnRseSBkaWZmZXIgaW4gdGhlIHdheXMgaW4gd2hpY2ggdGhleSBhbGxvY2F0ZSBkZW1hbmQgdG8gdGhlIGNsaW5pY3MuIEhvd2V2ZXIsIGl0IGlzIGludGVyZXN0aW5nIHRvIG5vdGUgdGhlIHJlbGF0aXZlbHkgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBwb3B1bGF0aW9uLXRvLXByb3ZpZGVyIHJhdGlvcyBhdCB0aGUgY2xpbmljcyBpbiB0aGUgMlNGQ0EgYW5kIHRoZSBjYXBhY2l0eS10by1kZW1hbmQgcmF0aW9zIHJhdGlvcyBpbiB0aGUgTU5MIG1vZGVsIHdpdGggdGhlIHNjYXR0ZXJwbG90IHJldmVhbGluZyBzb21lIG5vbi1saW5lYXJpdHkgaW4gdGhpcyByZWxhdGlvbnNoaXAgYWNyb3NzIHRoZSBtZXRob2RzLgoKYGBge3IgcHByX2Rpc3RfZmlnLCBmaWcuY2FwPSJcXGxhYmVse2ZpZzpwcHJfZGlzdH1Db21wYXJpbmcgQWNjZXNzaWJpbGl0eSBEaXN0cmlidXRpb25zIiwgb3V0LndpZHRoID0gJzEwMCUnfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi9pbWcvcGFpcl9wbG90X3Bwci5qcGciKQpgYGAKCkZpZ3VyZSBccmVme2ZpZzpsb3NfbWFwc30gZGlzcGxheXMgdGhlIGxldmVscyBvZiBzZXJ2aWNlIGZvciB0aGUgY2xpbmljIGxvY2F0aW9ucy4gSW4gZ2VuZXJhbCwgbW9yZSB1cmJhbiBjbGluaWNzIHRlbmQgdG8gZXhoaWJpdCBoaWdoZXIgbGV2ZWxzIG9mIGRlbWFuZCBhbmQgbG93ZXIgbGV2ZWxzIG9mIHNlcnZpY2UgYWNyb3NzIGFsbCB0aHJlZSBtb2RlbHMuIEhvd2V2ZXIsIHRoZSBwcm92aWRlci10by1wb3B1bGF0aW9uIHJhdGlvcyBmb3IgdGhlIGluZGl2aWR1YWwgY2xpbmljcyBpbiB0aGUgMlNGQ0EgYXJlIGV4dHJlbWVseSBzbWFsbCBjb21wYXJlZCB0byByZXN1bHRzIGZyb20gdGhlIEIyU0ZDQSBtb2RlbCwgaGlnaGxpZ2h0aW5nIGhvdyB0aGUgb3JpZ2luYWwgbWV0aG9kJ3MgbXVsdGlwbGUgY291bnRpbmcgdGVuZHMgdG8gaW5mbGF0ZSB0aGUgKHRyYXZlbCB0aW1lIHdlaWdodGVkKSBwb3B1bGF0aW9uIG51bWJlcnMgaW4gZWFjaCBjbGluaWMncyBjYXRjaG1lbnQgYW5kIGRlZmxhdGUgdGhlIGxldmVsIG9mIHNlcnZpY2UgYXZhaWxhYmxlIGF0IHRoZSBjbGluaWNzLiBJbiBjb250cmFzdCwgdGhlIFBQUnMgaW4gdGhlIEIyU0ZDQSBtZXRob2QgYXJlIHJlYWRpbHkgaW50ZXJwcmV0YWJsZSBhcyB0aGUgbG9jYWwgcmF0aW8gb2YgZG9jdG9ycyBwZXIgcGVyc29uIGZvciBhIGdpdmVuIGNsaW5pYyBjb25zaWRlcmluZyB0aGUgKHRyYXZlbC10aW1lIHdlaWdodGVkIGFuZCBhcHBvcnRpb25lZCkgcG9wdWxhdGlvbnMgd2l0aGluIGl0cyBjYXRjaG1lbnQuIFNpbWlsYXJseSwgdGhlIE1OTCBDRFJzIHJlZmxlY3QgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB0cmlwIGRlbWFuZCBhbmQgcGF0aWVudCBjYXBhY2l0eSBiYXNlZCBvbiB0aGUgYXNzdW1lZCByYXRlcy4gSW4gdGVybXMgb2Ygc3BhdGlhbCB0cmVuZHMsIHJlc3VsdHMgZnJvbSB0aGUgMlNGQ0EgYW5kIE1OTCBtb2RlbHMgc3VnZ2VzdCBib3RoIGNhbGN1bGF0ZSBoaWdoZXIgbGV2ZWxzIG9mIHNlcnZpY2UgYXQgbGFyZ2VyIGNsaW5pY3MgaW4gdGhlIHVyYmFuIGNvcmUgYXMgd2VsbCBhcyBhdCBhIGxhcmdlciBjbGluaWMgaW4gdGhlIGNpdHkncyBydXJhbCBub3J0aC13ZXN0LiBJbiBjb250cmFzdCwgdGhlIEIyU0ZDQSBtZXRob2QgZ2VuZXJhbGx5IHByb2R1Y2VzIGhpZ2hlciBsZXZlbHMgb2Ygc2VydmljZSBpbiBhbiBlYXN0LXRvLXdlc3QgZGlyZWN0aW9uLiBUaGlzIGNvdWxkIHJlZmxlY3QgYm91bmRhcnkgZWZmZWN0cyBpbiB0aGUgc3R1ZHkgYXJlYSB0aGF0IG9taXQgdGhlIGxhcmdlIHBvcHVsYXRpb25zIHByZXNlbnQgaW4gdGhlIHJlc3Qgb2YgdGhlIEdyZWF0ZXIgVG9yb250byBBcmVhIG9uIHRoZSBub3J0aGVybiBzaWRlIG9mIExha2UgT250YXJpbyB0aGF0IG1heSBhbHNvIGhhdmUgYWNjZXNzIHRvIHRoZXNlIGNsaW5pY3MgYnkgZHJpdmluZy4KCmBgYHtyIGxvc19tYXBzX2ZpZywgZmlnLmNhcD0iXFxsYWJlbHtmaWc6bG9zX21hcHN9Q29tcGFyaW5nIEFjY2Vzc2liaWxpdHkgRGlzdHJpYnV0aW9ucyIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4vaW1nL2xvc19tYXBzLmpwZyIpCmBgYAoKIyMgSGVhbHRoY2FyZSBBY2Nlc3NpYmlsaXR5CgpXaXRoIHRoZSBsZXZlbHMgb2Ygc2VydmljZSBjYWxjdWxhdGVkIGFib3ZlLCB0aGUgdGhyZWUgbW9kZWxzIHRoZW4gY2FsY3VsYXRlIGFjY2Vzc2liaWxpdHkgdG8gaGVhbHRoY2FyZSBzZXJ2aWNlcyBpbiBIYW1pbHRvbi4gRGlzdHJpYnV0aW9ucywgcmVsYXRpb25zaGlwcywgYW5kIGNvcnJlbGF0aW9ucyBmb3IgdGhlIGFjY2Vzc2liaWxpdHkgcmVzdWx0cyBhcmUgc2hvd24gaW4gRmlndXJlIFxyZWZ7ZmlnOmFjY2Vzc19kaXN0fS4gSW4gdGhpcyBjYXNlLCBhbGwgdGhyZWUgbW9kZWxzIGFyZSBoaWdobHkgY29ycmVsYXRlZC4gVGhlIDJTRkNBIGFuZCBCMlNGQ0EgcHJvZHVjZSBuZWFybHkgaWRlbnRpY2FsIGRpdHJpYnV0aW9ucyBvZiByZXN1bHRzLCBhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiB0aGUgYmFsYW5jZWQgbWV0aG9kLCB0aGUgYWNjZXNzaWJpbGl0aWVzIGNvcnJlc3BvbmQgdG8gdGhlIHN1bSBvZiB0cmF2ZWwgdGltZSB3ZWlnaHRlZCBhbmQgYXBwb3J0aW9uZWQgcHJvdmlkZXItdG8tcG9wdWxhdGlvbiByYXRpb3MgYXZhaWxhYmxlIGluIHRoZSBwb3B1bGF0aW9uIHpvbmVzIGZyZWUgb2YgdGhlIGluZmxhdGlvbiBhbmQgZGVmbGF0aW9uIHRoYXQgb2NjdXJzIGluIHRoZSAyU0ZDQS4gSW4gY29udHJhc3QsIHRoZSBzY2F0dGVycGxvdHMgb2YgdGhlIE1OTCByZXN1bHRzIGFnYWluIGhpZ2hsaWdodCBzb21lIG5vbi1saW5lYXJpdHkgaW4gdGhlIHdheSB0aGUgdXRpbGl0eS1iYXNlZCBhY2Nlc3NpYmlsaXRpZXMgYXJlIGNhbGN1bGF0ZWQgY29tcGFyZWQgdG8gdGhlIEZDQSBtZXRob2RzLiAKCmBgYHtyIGFjY2Vzc19kaXN0X2ZpZywgZmlnLmNhcD0iXFxsYWJlbHtmaWc6YWNjZXNzX2Rpc3R9Q29tcGFyaW5nIEFjY2Vzc2liaWxpdHkgRGlzdHJpYnV0aW9ucyIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4vaW1nL3BhaXJfcGxvdF9hY2Nlc3MuanBnIikKYGBgCgpUaGUgZ2VuZXJhbCBzcGF0aWFsIHRyZW5kcyBhcmUgc2ltaWxhciBhY3Jvc3MgYWxsIHRocmVlIG1vZGVscyAoRmlndXJlIFxyZWZ7ZmlnOmFjY2Vzc19tYXBzfSkuIFRoZSBhYnNvbHV0ZSBhY2Nlc3NpYmlsaXR5IHZhbHVlcyBkaWZmZXIgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB3YXlzIGVhY2ggbWV0aG9kIGNhbGN1bGF0ZXMgaXRzIGFjY2Vzc2liaWxpdHkgcmVzdWx0cy4gVGhlIEZDQSBtZXRob2RzIGRlZmluZSBhY2Nlc3NpYmlsaXR5IGJhc2VkIG9uIHRoZSBwaHlzaWNpYW4tdG8tcG9wdWxhdGlvbiByYXRpb3Mgb2YgY2xpbmljcywgcmVzdWx0aW5nIGluIHNtYWxsZXIgdmFsdWVzLiBJbiBjb250cmFzdCwgdGhlIE1OTCBtZXRob2QgZGVmaW5lcyBhY2Nlc3NpYmlsaXRpZXMgYXMgdGhlIGxvZ3N1bSBvZiB0aGUgbXVsdGlub21pYWwgbG9naXQgbW9kZWwsIHJlc3VsdGluZyBpbiBsYXJnZXIgdmFsdWVzIHRoYXQgaGF2ZSBubyBkaXJlY3QgaW50ZXJwcmV0YXRpb24uIEluIGdlbmVyYWwsIHRoZSBoaWdoZXN0IGFjY2Vzc2liaWxpdGllcyB0byBwcmltYXJ5IGNhcmUgcGh5c2ljaWFucyBjb3JyZXNwb25kIHRvIHRoZSBkb3dudG93biBhcmVhIG9mIEhhbWlsdG9uLCB3aGVyZSBhIGxhcmdlIG51bWJlciBvZiBjbGluaWNzIGFyZSBjb25jZW50cmF0ZWQuIEFjY2Vzc2liaWxpdHkgdG8gcGh5c2ljaWFucyBnZW5lcmFsbHkgZGVjcmVhc2VzIHdpdGggaW5jcmVhc2VkIGRpc3RhbmNlIGZyb20gdGhlIGRvd250b3duIGFyZWEuCgpgYGB7ciBwbG90IGFjY2Vzc19tYXBzLCBmaWcuY2FwPSJcXGxhYmVse2ZpZzphY2Nlc3NfbWFwc31BY2Nlc3NpYmlsaXR5IFJlc3VsdHMiLCBvdXQud2lkdGggPSAnMTAwJSd9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIuL2ltZy9hY2Nlc3NfbWFwcy5qcGciKQpgYGAKClRvIGJldHRlciBoaWdobGlnaHQgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gdGhlIHNwYXRpYWwgcGF0dGVybnMgb2YgYWNjZXNzaWJpbGl0eSBwcm9kdWNlZCBieSBlYWNoIG1ldGhvZCwgRmlndXJlIFxyZWZ7ZmlnOmFjY2Vzc19kaWZmX21hcHN9IGRpc3BsYXlzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBpbiB0aGUgbm9ybWFsaXplZCBhY2Nlc3NpYmlsaXRpZXMgYWNyb3NzIG1vZGVscy4gSW4gZ2VuZXJhbCwgdGhlIE1OTCBtZXRob2QgdGVuZHMgdG8gcHJvZHVjZSBoaWdoZXIgYWNjZXNzaWJpbGl0aWVzIGZvciBtb3N0IHpvbmVzIGNvbXBhcmVkIHRvIHRoZSBGQ0EgbWV0aG9kcy4gSW4gbGluZSB3aXRoIHRoZSBkaXN0cmlidXRpb25zIGFib3ZlLCB0aGUgMlNGQ0EgYW5kIEIyU0ZDQSBtb2RlbHMgYXBwZWFyIHRvIGJlIG1vc3Qgc2ltaWxhciwgd2l0aCBvbmx5IHNsaWdodCBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBpbiB0aGUgY2FsY3VsYXRlZCBhY2Nlc3NpYmlsaXR5IHZhbHVlcy4KCmBgYHtyIHBsb3QgYWNjZXNzX2RpZmZfbWFwcywgZmlnLmNhcD0iXFxsYWJlbHtmaWc6YWNjZXNzX2RpZmZfbWFwc31BY2Nlc3NpYmlsaXR5IERpZmZlcmVuY2VzIiwgb3V0LndpZHRoID0gJzEwMCUnfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi9pbWcvYWNjZXNzX2RpZmZfbWFwcy5qcGciKQpgYGAKClRvIGV4YW1pbmUgd2hldGhlciB0aGVyZSBhcmUgYW55IHNwYXRpYWwgcGF0dGVybnMgaW4gdGhlc2UgZGlmZmVyZW5jZXMsIEZpZ3VyZSBccmVme2ZpZzphY2Nlc3NfbG9jbV9tYXBzfSBwbG90cyB0aGUgcmVzdWx0cyBvZiBMb2NhbCBNb3JhbidzIEkgdGVzdHMuIFRvIG1ha2UgdGhlIHZhbHVlcyBjb21wYXJhYmxlLCB3ZSBmaXJzdCBub3JtYWxpemUgZWFjaCBhY2Nlc3NpYmlsaXR5IHZlY3RvciBiZXR3ZWVuIDAtMSBhbmQgdGFrZSB0aGUgZGlmZmVyZW5jZXMgb2YgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzIGFjcm9zcyBlYWNoIGFwcHJvYWNoLiBOZXh0LCB0aGUgTG9jYWwgTW9yYW4ncyBJIGlzIGNhbGN1bGF0ZWQgb24gdGhlIGRpZmZlcmVuY2VzIHVzaW5nIHF1ZWVuLXN0eWxlIGNvbnRpZ3VpdHkgd2VpZ2h0cywgYSBjcml0aWNhbCBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgJHA9MC4wNSQsIGFuZCB3aXRob3V0IGNvcnJlY3RpbmcgZm9yIG11bHRpcGxlIHRlc3RpbmcuIFRoZSByZXN1bHRpbmcgbWFwcyByZXZlYWwgc29tZSBpbnRlcmVzdGluZyBwYXR0ZXJucyBvZiBzcGF0aWFsIGNsdXN0ZXJpbmcgaW4gdGhlIGNhbGN1bGF0ZWQgbm9ybWFsaXplZCBkaWZmZXJlbmNlcywgcGFydGljdWxhcmx5IGFjcm9zcyB0aGUgdHdvIEZDQSBtb2RlbHMgY29tcGFyZWQgdG8gdGhlIE1OTCBtb2RlbC4gSGVyZSwgZGlmZmVyZW5jZXMgaW4gYWNjZXNzaWJpbGl0eSBhcmUgZ3JlYXRlc3QgYmV0d2VlbiB0aGUgRkNBIGFuZCBNTkwgbWV0aG9kcyBpbiB0aGUgbG93LWxvdyAoTEwpIGNsdXN0ZXIgaW4gdGhlIHJpbmcgb2Ygb3V0ZXIgc3VidXJicyB0aGF0IHN1cnJvdW5kIHRoZSBjaXR5LiBJbiBjb250cmFzdCwgdGhlIGNhbGN1bGF0ZWQgYWNjZXNzaWJpbGl0aWVzIGFyZSBtb3JlIGNvbnNpc3RlbnQgYWNyb3NzIHRoZSBtZXRob2RzIGluIHRoZSBoaWdoLWhpZ2ggKEhIKSBjbHVzdGVyIGluIHRoZSBjZW50cmFsIHBhcnQgb2YgdGhlIGNpdHkuIERpZmZlcmVuY2VzIGluIHRoZSByZW1haW5pbmcgem9uZXMgYXJlIG5vdCBzaWduaWZpY2FudCAoTlMpLiAKClRoaXMgb3ZlcmFsbCBwYXR0ZXJuIGlzIGxpa2VseSBkdWUgdG8gdGhlIHdheSB0aGUgTU5MIGFwcHJvYWNoIGhhbmRsZXMgY2xpbmljIGNob2ljZXMgd2l0aCBwb3B1bGF0aW9ucyB0ZW5kaW5nIHRvIHNlbGVjdCB0aGVpciBuZWFyZXN0IGNsaW5pY3MuIE9uIHRoZSBvbmUgaGFuZCwgdGhlIGdyZWF0ZXIgYWNjZXNzaWJpbGl0aWVzIGluIG1vcmUgc3VidXJiYW4gYW5kIHJ1cmFsIHpvbmVzIGxpa2VseSBkZXJpdmVkIGZyb20gdGhlc2UgcG9wdWxhdGlvbnMgYWNjZXNzaW5nIHRoZWlyIGNsb3Nlc3QgZmFjaWxpdHkuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIGFsc28gbWVhbnMgdGhhdCBmZXdlciBpbmRpdmlkdWFscyBmcm9tIG1vcmUgdXJiYW4gbG9jYXRpb25zIGFyZSBjb21wZXRpbmcgZm9yIGhlYWx0aGNhcmUgcmVzb3VyY2VzIGluIHRoZXNlIG1vcmUgc3VidXJiYW4gYW5kIHJ1cmFsIGFyZWFzLCBsZWFkaW5nIHRvIGhpZ2hlciBsZXZlbHMgb2Ygc2VydmljZSBhdCB0aGVzZSBzdWJ1cmJhbiBhbmQgcnVyYWwgY2xpbmljcy4gSW4gY29udHJhc3QsIHRoZSBGQ0EgbWV0aG9kcyBhbGxvY2F0ZSBwb3B1bGF0aW9ucyB0byBhbGwgY2xpbmljcyB3aXRoaW4gdGhlaXIgY2F0Y2htZW50IGFyZWEgdXNpbmcgd2VpZ2h0cyBkZXJpdmVkIGZyb20gdGhlIGltcGVkYW5jZSBmdW5jdGlvbi4gV2hpbGUgdGhpcyBwcm9kdWNlcyBhIHNtb290aGluZyBvZiB0aGUgYWNjZXNzaWJpbGl0aWVzLCBpdCBjYW4gcmVzdWx0IGluIGxvd2VyIGxldmVscyBvZiBzZXJ2aWNlIGFuZCBhY2Nlc3NpYmlsaXR5IGZvciBjbGluaWNzIHRoYXQgcG9wdWxhdGlvbnMgbWF5IG5vdCBhY3R1YWxseSB1c2UuIFRoaXMgZWZmZWN0IHNlZW1zIHRvIGJlIG1pbmltaXplZCBpbiBtb3JlIHVyYmFuIGxvY2F0aW9ucyBmZWF0dXJpbmcgaGlnaGVyIHBvcHVsYXRpb24gZGVuc2l0aWVzIGFuZCBhIGdyZWF0ZXIgbnVtYmVyIG9mIGNsaW5pY3Mgd2l0aCBhdmFpbGFibGUgcGh5c2ljaWFucy4gQ29tcGFyaW5nIHRoZSBub3JtYWxpemVkIHJlc3VsdHMgZnJvbSB0aGUgMlNGQ0EgYW5kIHRoZSBCMlNGQ0EgbW9kZWxzLCB0aGUgcGF0dGVybnMgb2Ygc3BhdGlhbCBjbHVzdGVyaW5nIGluIHRoZSBkaWZmZXJlbmNlcyBhcHBlYXJzIHRvIGJlIGxlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaXR5J3MgdXJiYW4tc3VidXJiYW4tcnVyYWwgdXJiYW4gc3RydWN0dXJlLiBXaGlsZSB0aGUgQjJTRkNBIG1ldGhvZCBnZW5lcmFsbHkgY2FsY3VsYXRlcyBzbGlnaHRseSBoaWdoZXIgYWNjZXNzaWJpbGl0aWVzIGFjcm9zcyBtdWNoIG9mIHRoZSBjaXR5LCB0aGUgbWV0aG9kcyBhcmUgbW9zdCBkaXNzaW1pbGFyIGluIHRoZSBzb3V0aC13ZXN0IHJ1cmFsIGFyZWEuCgpgYGB7ciBmaWcgNCwgZmlnLmNhcD0iXFxsYWJlbHtmaWc6YWNjZXNzX2xvY21fbWFwc31BY2Nlc3NpYmlsaXR5IERpZmZlcmVuY2UgSG90IFNwb3RzIiwgb3V0LndpZHRoID0gJzEwMCUnfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi9pbWcvYWNjZXNzX2xvY21fbWFwcy5qcGciKQpgYGAKCiMgRGlzY3Vzc2lvbiBhbmQgQ29uY2x1c2lvbnMKClRoaXMgc3R1ZHkgZGV2ZWxvcHMgYSBtdWx0aW5vbWlhbCBsb2dpdCBkZXN0aW5hdGlvbiBjaG9pY2UgbW9kZWwgZm9yIGNhbGN1bGF0aW5nIHRyYW5zcG9ydGF0aW9uIGFjY2Vzc2liaWxpdHkgdG8gcHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMgaW4gdGhlIENpdHkgb2YgSGFtaWx0b24uIFRoaXMgbWV0aG9kIGlzIGNvbXBhcmVkIHRvIHRoZSBFMlNGQ0EgbWV0aG9kLCBhbmQgYW4gYW5hbHlzaXMgb2YgdGhlIGltcGFjdCBvZiBpbmNvbWUgb24gYWNjZXNzaWJpbGl0eSBpcyB1bmRlcnRha2VuIHVzaW5nIGJvdGggbWV0aG9kcy4gVGhlIGFjY2Vzc2liaWxpdHkgcGF0dGVybnMgcHJvZHVjZWQgYnkgYm90aCBtZXRob2RzIGluZGljYXRlIHRoYXQgdGhlIGhpZ2hlc3QgYWNjZXNzaWJpbGl0aWVzIHRvIHByaW1hcnkgY2FyZSBwaHlzaWNpYW5zIGFyZSBpbiB0aGUgZG93bnRvd24gYXJlYSBvZiBIYW1pbHRvbi4gSG93ZXZlciwgdGhlIGFyZWEgd2l0aCB0aGUgaGlnaGVzdCBhY2Nlc3NpYmlsaXRpZXMgaXMgbXVjaCBsYXJnZXIgd2l0aCB0aGUgcHJvcG9zZWQgbWV0aG9kLCBlbmNvbXBhc3NpbmcgYm90aCB0aGUgY2l0eSBjZW50cmUgYW5kIHNvbWUgc3VidXJiYW4gYXJlYXMuIFRoZSBwcm9wb3NlZCBtZXRob2QgcHJvZHVjZXMgbW9yZSBwbGF1c2libGUgZGlzdHJpYnV0aW9ucyBhcyBjb21wYXJlZCB0byB0aGUgRTJTRkNBIG1ldGhvZCwgYXMgbW9yZSBEQXMgaGF2ZSBlaXRoZXIgbWVkaXVtIHRvIGhpZ2ggYWNjZXNzaWJpbGl0aWVzIG9yIGV4dHJlbWVseSBsb3cgYWNjZXNzaWJpbGl0aWVzLiBJbiBjb250cmFzdCwgdGhlIEUyU0ZDQSBtZXRob2QgcmVzdWx0cyBpbiBtYW55IGhpZ2gtYWNjZXNzIGFyZWFzIGRlc3BpdGUgY29uZ2VzdGVkIGNsaW5pY3MsIGFzIHdlbGwgYXMgbG93LWFjY2VzcyBhcmVhcyB3aXRoIGhpZ2hlciBhY2Nlc3NpYmlsaXRpZXMgdGhhbiB0aGUgcHJvcG9zZWQgbWV0aG9kIGRlc3BpdGUgbG93ZXIgY2FwYWNpdGllcyBhbmQgbG9uZ2VyIHRyYXZlbCB0aW1lcy4gT3ZlcmFsbCwgdGhlIHByb3Bvc2VkIG1ldGhvZG9sb2d5IGltcHJvdmVzIHVwb24gZXhpc3RpbmcgbWV0aG9kcywgYXMgaXQgYWRkcmVzc2VzIGFsbCBzaXggb2YgdGhlIGFjY2Vzc2liaWxpdHkgYXhpb21zIGFuZCBkb2VzIG5vdCBvdmVyLWVzdGltYXRlIGRlbWFuZC4gQm90aCB0aGUgRTJTRkNBIG1ldGhvZCBhbmQgdGhlIHByb3Bvc2VkIG1ldGhvZCByZXN1bHQgaW4gbG93LWluY29tZSBhcmVhcyBoYXZpbmcgdGhlIGhpZ2hlc3QgYWNjZXNzaWJpbGl0aWVzLiBUaGUgc2Vuc2l0aXZpdHkgYW5hbHlzaXMgc3VnZ2VzdHMgdGhhdCBpbmNyZWFzZWQgZGV2ZWxvcG1lbnQgYW5kIGluY3JlYXNlZCBjb25nZXN0aW9uIGluIHRoZSBDaXR5IG9mIEhhbWlsdG9uIGJvdGggcmVzdWx0IGluIHJlZHVjZWQgYWNjZXNzaWJpbGl0aWVzLCBhbHRob3VnaCB0aGUgbW9kZWwgaXMgbW9yZSBzZW5zaXRpdmUgdG8gdGhlIG51bWJlciBvZiBob3VzZWhvbGRzIGluIGNvbXBhcmlzb24gdG8gdHJhdmVsIHRpbWVzLiBUaGUgbW9kZWwgY2FuIHRoZXJlZm9yZSBiZSB1c2VkIHRvIHByb2plY3QgYWNjZXNzaWJpbGl0aWVzIGluIHRoZSBmdXR1cmUgYW5kIGFkanVzdCBjbGluaWMgY2FwYWNpdGllcyBhY2NvcmRpbmdseS4gSG93ZXZlciwgbW9yZSB3b3JrIGlzIHJlcXVpcmVkIHRvIGNhbGlicmF0ZSB0aGUgbW9kZWwgdG8gYmV0dGVyIGZpdCBvYnNlcnZlZCBkYXRhIGFuZCB0byBpbmNsdWRlIG5vbi1hdXRvIG1vZGVzIG9mIHRyYXZlbC4KCgpyZWZyYW1lcyB0aGUgY2FsY3VsYXRpb24gb2YgaGVhbHRoY2FyZSBhY2Nlc3NpYmlsaXRpZXMgaW50byB0cmlwbWFraW5nIGNob2ljZXMuIENvbXBhcmVkIHRvIAoKRkNBIGFwcHJvYWNoZXMgY29uc2lkZXIgcHJvdmlkZXItdG8tcG9wdWxhdGlvbiByYXRpb3Mgd2VpZ2h0ZWQgYnkgZGlzdGFuY2Ugb3IgdHJhdmVsIHRpbWUgYXMgYSBtZWFzdXJlIG9mIGFjY2Vzc2liaWxpdHkgdG8gaGVhbHRoY2FyZS4gSW4gdGhpcyBzZW5zZSwgY29uZ2VzdGlvbiBhdCBjbGluaWNzIGlzIGEgZnVuY3Rpb24gb2YgdGhlIHBvcHVsYXRpb25zIHRoZXkgc2VydmUgd2l0aGluIHRoZSB0cmF2ZWwgdGltZSB3aW5kb3cgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWNhdGlvbiBvZiBpbXBlZGFuY2UuIFRoZSBNTkwgYXBwcm9hY2ggcmVmcmFtZXMgdGhlIG1lYXN1cmVtZW50IG9mIGhlYWx0aCBhY2Nlc3NpYmlsaXR5IGludG8gaW5kaXZpZHVhbCB0cmlwcyB0byB2aXNpdCBwcmltYXJ5IGNhcmUgcGh5c2ljaWFucywgdGhlIGNhcGFjaXR5IG9mIHBoeXNpY2lhbnMgdG8gc2VlIHBhdGllbnRzLCBhbmQgY29uZ2VzdGlvbiBlZmZlY3RzIGZyb20gdGhlIGVzdGltYXRlZCB0cmlwcy4gVGhlIGl0ZXJhdGl2ZSBmaXR0aW5nIHByb2NlZHVyZSByZXN1bHRzIGluIHRoZSBhc3NpZ25tZW50IG9mIAoKIyBSZWZlcmVuY2VzCg==